如何使用索引将大型 PDF(文档包)拆分为页面块
How to split a large PDF(document bundle) into chunks of pages using the index
我正在尝试拆分大型 PDF 文档包类型。此 PDF 有一个链接到不同页面的索引页面,例如。
索引:
主题 1:第 1-5 页
主题 2:第 12-25 页
我目前正在使用 PDFbox 加载 PDF 并获取页码,但我正在寻找一种方法来获取元数据以允许我按主题对页面进行分组
如果有一种检索文档结构的方法,那么我可以将文档分组分解成更小的 PDF,例如。主题 1 现在变成合并了第 1-5 页的单个 PDF。
代码如下:
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 "Document Outline" 节。文档大纲是一个树结构,提供文档各个部分的链接。例如,如果您将 LibreOffice 文档转换为 PDF,标题将用于大纲。
如果你的PDF有这样的轮廓,你可以用它来分割。
如果它只有一个索引页,可能有 PDF 标签(请参阅第 14.8 节 "Tagged PDF")可用于轻松获取所需数据。
如果没有 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 有一个链接到不同页面的索引页面,例如。
索引:
主题 1:第 1-5 页
主题 2:第 12-25 页
我目前正在使用 PDFbox 加载 PDF 并获取页码,但我正在寻找一种方法来获取元数据以允许我按主题对页面进行分组
如果有一种检索文档结构的方法,那么我可以将文档分组分解成更小的 PDF,例如。主题 1 现在变成合并了第 1-5 页的单个 PDF。
代码如下:
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 "Document Outline" 节。文档大纲是一个树结构,提供文档各个部分的链接。例如,如果您将 LibreOffice 文档转换为 PDF,标题将用于大纲。
如果你的PDF有这样的轮廓,你可以用它来分割。
如果它只有一个索引页,可能有 PDF 标签(请参阅第 14.8 节 "Tagged PDF")可用于轻松获取所需数据。
如果没有 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();
}