Java 如何使用索引将大型PDF(文档包)拆分为页面块

Java 如何使用索引将大型PDF(文档包)拆分为页面块,java,pdf,pdfbox,Java,Pdf,Pdfbox,我正在尝试拆分一个大型PDF类型的文档包。此PDF有一个索引页,链接到不同的页面,例如 索引: 主题1:第1-5页 主题2:第12-25页 我目前正在使用PDFbox来读取PDF并获取页码,但我正在寻找一种获取元数据的方法,以便能够根据主题对页面进行分组 如果有检索文档结构的方法,那么我可以将文档分组,并将其分解为更小的PDF,例如,主题1现在变成单个PDF,合并了第1-5页 代码如下: PDDocumentOutline outline = pdocument.getDocumentCatal

我正在尝试拆分一个大型PDF类型的文档包。此PDF有一个索引页,链接到不同的页面,例如

索引:

主题1:第1-5页

主题2:第12-25页

我目前正在使用PDFbox来读取PDF并获取页码,但我正在寻找一种获取元数据的方法,以便能够根据主题对页面进行分组

如果有检索文档结构的方法,那么我可以将文档分组,并将其分解为更小的PDF,例如,主题1现在变成单个PDF,合并了第1-5页

代码如下:

PDDocumentOutline outline = pdocument.getDocumentCatalog().getDocumentOutline();

for (PDOutlineItem item : outline.children()) {

String pageTitle=item.getTitle(); //Topic 1

PDPage destinationPage=item.findDestinationPage(pdocument);

//How do I get actual pageNumber of Page?

//How do I get Destination reference string ie. pg 1-5


}

您可能想看看PDF 1.7规范中的第12.3.3节“文档大纲”。文档大纲是一个树形结构,提供指向文档各个部分的链接。例如,如果将LibreOffice文档转换为PDF,则标题将用于大纲

如果你的PDF有这样一个大纲,你可以用它来分割它

如果它只有一个索引页,可能有PDF标签(见第14.8节“带标签的PDF”)可用于轻松获取所需数据


如果没有PDF标签,您可能需要解析文本并对其进行分析以获得所需信息。

您可能需要查看PDF 1.7规范中的第12.3.3节“文档大纲”。文档大纲是一个树形结构,提供指向文档各个部分的链接。例如,如果将LibreOffice文档转换为PDF,则标题将用于大纲

PDDocumentOutline outline = pdocument.getDocumentCatalog().getDocumentOutline();
PDPageTree pageTree = pdocument.getPages();

for (PDOutlineItem item : outline.children()) {

String pageTitle=item.getTitle(); //Topic 1

PDPage destinationPage=item.findDestinationPage(pdocument);

PDPage currentPage = item.findDestinationPage(pdocument);
int startPg = pageTree.indexOf(currentPage);

PDPage nextIndexPage = item.getNextSibling().findDestinationPage(pdocument);

int endPg = pageTree.indexOf(nextIndexPage);

PDDocument document = new PDDocument();

for (int i = startPg; i < endPg; i++) {

    PDPage incomingPage = pageTree.get(i);

    document.addPage(incomingPage);

    }

document.save(targetPath + item.getTitle() + ".pdf");
document.close();



}
如果你的PDF有这样一个大纲,你可以用它来分割它

如果它只有一个索引页,可能有PDF标签(见第14.8节“带标签的PDF”)可用于轻松获取所需数据

如果没有PDF标记,您可能需要解析文本并对其进行分析,以获得所需信息。

PDDocumentOutline outline=pdocument.getDocumentCatalog().getDocumentOutline();
PDDocumentOutline outline = pdocument.getDocumentCatalog().getDocumentOutline();
PDPageTree pageTree = pdocument.getPages();

for (PDOutlineItem item : outline.children()) {

String pageTitle=item.getTitle(); //Topic 1

PDPage destinationPage=item.findDestinationPage(pdocument);

PDPage currentPage = item.findDestinationPage(pdocument);
int startPg = pageTree.indexOf(currentPage);

PDPage nextIndexPage = item.getNextSibling().findDestinationPage(pdocument);

int endPg = pageTree.indexOf(nextIndexPage);

PDDocument document = new PDDocument();

for (int i = startPg; i < endPg; i++) {

    PDPage incomingPage = pageTree.get(i);

    document.addPage(incomingPage);

    }

document.save(targetPath + item.getTitle() + ".pdf");
document.close();



}
PDPageTree pageTree=pdocument.getPages(); 对于(PDOutlineItem:outline.children()){ String pageTitle=item.getTitle();//主题1 PDPage destinationPage=项目。findDestinationPage(PDDocument); PDPage currentPage=项目。findDestinationPage(pdocument); int startPg=pageTree.indexOf(当前页面); PDPage nextIndexPage=item.getNextSibling().findDestinationPage(pdocument); int endPg=pageTree.indexOf(nextIndexPage); PDDocument文档=新PDDocument(); 对于(int i=startPg;i
PDDocumentOutline outline=pdocument.getDocumentCatalog().getDocumentOutline();
PDPageTree pageTree=pdocument.getPages();
对于(PDOutlineItem:outline.children()){
String pageTitle=item.getTitle();//主题1
PDPage destinationPage=项目。findDestinationPage(PDDocument);
PDPage currentPage=项目。findDestinationPage(pdocument);
int startPg=pageTree.indexOf(当前页面);
PDPage nextIndexPage=item.getNextSibling().findDestinationPage(pdocument);
int endPg=pageTree.indexOf(nextIndexPage);
PDDocument文档=新PDDocument();
对于(int i=startPg;i
我已经能够获得文档的大纲,它为我提供了每个PDOutlineItem的目标页面。如何获取每页的实际页码。我正在尝试对页面进行分组(例如,主题1=第1页到第5页)
doc.getPages().indexOf()
。结果是基于0的。我已经能够得到文档的大纲,它为我提供了每个PDOutlineItem的目标页面。如何获取每页的实际页码。我正在尝试对页面进行分组(例如,主题1=第1页到第5页)
doc.getPages().indexOf()
。结果以0为基础。