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

itext7 Java为现有pdf中的标题创建PdfExplicitDestination,java,pdf,position,bookmarks,itext7,Java,Pdf,Position,Bookmarks,Itext7,我使用PdfExplicitDestination作为页码,通过读取页面中现有的pdf内容来获取标题 但我需要在单击书签时将重点放在特定的文本内容上 for (int page = 1; page <= pdf.getNumberOfPages(); page++) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); String currentText = PdfTextExtr

我使用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中的现有内容中获得它。

这项任务可以通过多种方式完成。其中一个方法是浏览“条形”(矩形高度小)的页面内容,只考虑一个小矩形的内容。如果您在这样的矩形中找到一个文本块,那么您就知道矩形坐标给定的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
        }
    }
}
final float windowHeight=30;
最终浮动步骤=10;
对于(int page=1;page 0;upperPoint-=step){
IEventFilter filter=new TextRegionEventFilter(新矩形(0,upperPoint-windowHeight,pageSize.getWidth(),windowHeight));
LocationTextExtractionStrategy策略=新LocationTextExtractionStrategy();
FilteredTextEventListener=新的FilteredTextEventListener(策略,筛选器);
新的PdfCanvasProcessor(listener).processPageContent(pdf.getPage(page));
if(strategy.getResultantText()包含(“标题”)){
float top=upperPoint;//这是矩形的最顶端点
break;//在此处中断以不捕获同一文本两次
}
}
}
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
        }
    }
}