itext7 Java为现有pdf中的标题创建PdfExplicitDestination

时间:2019-07-17 05:08:00

标签: java pdf position bookmarks itext7

我正在使用PdfExplicitDestination作为页码,通过从页面读取现有的pdf内容来获取标题,

但是我需要在单击书签时将重点放在特定的文本内容上。

for (int page = 1; page <= pdf.getNumberOfPages(); page++) {
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    String currentText = PdfTextExtractor.getTextFromPage(pdf.getPage(page), strategy);
    if (currentText.contains("title")) {
        k.addDestination(PdfExplicitDestination.createXYZ(pdf.getPage(page), pdf.getPage(page).getPageSize().getLeft(), pdf.getPage(page).getPageSize().getTop(), 0));
        //System.out.println(currentText);
        }
    }

我需要在pdf页面中找到标题的位置,以设置“浮动顶部”值。

PdfExplicitDestination.createXYZ(pageNum, left, top, zoom)

任何人都可以帮助从pdf中的现有内容中获取它。

1 个答案:

答案 0 :(得分:1)

可以通过多种方式来完成此任务。一种方法是遍历“条纹”(高度较小的矩形)中的页面内容,并且一次仅考虑来自这样一个小矩形的内容。如果在这样的矩形中找到文本,则知道矩形坐标给出的Y位置的上限和下限之间的某处是所需的文本内容。您可以例如在这种情况下,请创建指向最高坐标的目标-可能会比所需文本高一点,但是根据您选择的矩形高度,差异会很小。

下面的代码片段包含了所提出思想的示例实现。有两个参数-windowHeight必须足够高以适合您要查找的内容,但是此变量越小,结果得到的精度越高。参数step定义了我们将在每个页面上尝试多少个高度windowHeight的矩形。参数越小,您获得的精度越好,但是参数值越大,性能越好。直到特定的用例才能调整这些权衡。

final float windowHeight = 30;
final float step = 10;

for (int page = 1; page <= pdf.getNumberOfPages(); page++) {
    Rectangle pageSize = pdf.getPage(page).getPageSize();
    for (float upperPoint = pageSize.getHeight(); upperPoint > 0; upperPoint -= step)  {
        IEventFilter filter = new TextRegionEventFilter(new Rectangle(0, upperPoint - windowHeight, pageSize.getWidth(), windowHeight));
        LocationTextExtractionStrategy strategy = new LocationTextExtractionStrategy();
        FilteredTextEventListener listener = new FilteredTextEventListener(strategy, filter);
        new PdfCanvasProcessor(listener).processPageContent(pdf.getPage(page));
        if (strategy.getResultantText().contains("title")) {
            float top = upperPoint; // This is the topmost point of the rectangle
            break; // Break here not to capture same text twice
        }
    }
}