Apache PDFBox PDFTextStripper 访问页面的文本部分,我该怎么做?
Apache PDFBox PDFTextStripper access text parts of the page, how can I?
我正在使用 apache 的 PDFBox 版本 2 解析 PDF 文档。0.x
我已经看到很多关于将 header/footer 与实际内容分开的问题。
我的发现是这些部分有一些概念(在我的示例 PDF 中),因为 SortByPosition 标志对内容写入文本的顺序有影响。
当我将 SortByPosition 设置为 false 时,我首先得到 header/footer 然后是正文(并且这对每一页重复)。
当我将 SortByPostion 设置为 true 时,我会按照 PDF Reader.
屏幕上显示的顺序获取内容
PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setSortByPosition(true);
String content = textStripper.getText(pdf);
System.out.println(content);
所以在内部,这些文本片段可以单独使用 "textblocks"。
我的问题是:有没有办法让我单独访问这些块?
下面是排序标志为真的这段代码的输出
Header PDF MIC
Vandaag meer dan 1 pagina
Door mij geschreven
1
Header PDF MIC
Dan is dit pagina 2
Met veel meer teksten en woorden.
2
这是排序标志为 false 的输出
Header PDF MIC
1
Vandaag meer dan 1 pagina
Door mij geschreven
Header PDF MIC
2
Dan is dit pagina 2
Met veel meer teksten en woorden.
感谢@mkl 的提示和技巧,这是我所做的:
一段使用 PDFMarkedContentExtractor 的 Java 代码,这只需要第一页,但我们可以将其应用于所有页面。
在代码下方,您可以找到 System.out 日志的输出。
ExtraMetaData emd = new ExtraMetaData(); //this my own class to carry the header and footer
PDFMarkedContentExtractor markedContentExtractor = new PDFMarkedContentExtractor();
markedContentExtractor.processPage(document.getPage(0));
List<PDMarkedContent> markedContents = markedContentExtractor.getMarkedContents();
for (Iterator iterator = markedContents.iterator(); iterator.hasNext();) {
PDMarkedContent pdMarkedContent = (PDMarkedContent) iterator.next();
System.out.println(pdMarkedContent.getTag()+" --> "+pdMarkedContent.getContents()+ " "+pdMarkedContent.getProperties());
COSDictionary pdmcProperties = pdMarkedContent.getProperties();
if (pdmcProperties.containsKey("Subtype")) {
COSBase cosBase = pdmcProperties.getDictionaryObject("Subtype");
if (((COSName)cosBase).getName().equalsIgnoreCase("Footer")) {
emd.setFooter(getContentAsString(pdMarkedContent));
}
if (((COSName)cosBase).getName().equalsIgnoreCase("Header")) {
emd.setHeader(getContentAsString(pdMarkedContent));
}
}
if (pdmcProperties.containsKey("Attached")) {
COSArray cosArray = (COSArray) pdmcProperties.getDictionaryObject("Attached");
for (COSBase cosBase2 : cosArray) {
if (((COSName)cosBase2).getName().equalsIgnoreCase("Bottom")) {
emd.setFooter(getContentAsString(pdMarkedContent));
}
if (((COSName)cosBase2).getName().equalsIgnoreCase("Top")) {
emd.setHeader(getContentAsString(pdMarkedContent));
}
}
}
}
输出
Artifact --> [-, , 1, , -, ]
COSDictionary{COSName{Attached}:COSArray{[COSName{Top}]};COSName{Type}:COSName{Pagination};}
Artifact --> [ ]
COSDictionary{COSName{Attached}:COSArray{[COSName{Bottom}]};COSName{Type}:COSName{Pagination};}
P --> [M, J, , -, , 2, 0, 1, 6, 2, 1, 7, 2, , /, , B, ]
COSDictionary{COSName{MCID}:COSInt{0};}
我正在使用 apache 的 PDFBox 版本 2 解析 PDF 文档。0.x 我已经看到很多关于将 header/footer 与实际内容分开的问题。 我的发现是这些部分有一些概念(在我的示例 PDF 中),因为 SortByPosition 标志对内容写入文本的顺序有影响。 当我将 SortByPosition 设置为 false 时,我首先得到 header/footer 然后是正文(并且这对每一页重复)。 当我将 SortByPostion 设置为 true 时,我会按照 PDF Reader.
屏幕上显示的顺序获取内容PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setSortByPosition(true);
String content = textStripper.getText(pdf);
System.out.println(content);
所以在内部,这些文本片段可以单独使用 "textblocks"。 我的问题是:有没有办法让我单独访问这些块?
下面是排序标志为真的这段代码的输出
Header PDF MIC
Vandaag meer dan 1 pagina
Door mij geschreven1
Header PDF MIC
Dan is dit pagina 2
Met veel meer teksten en woorden.2
这是排序标志为 false 的输出
Header PDF MIC
1
Vandaag meer dan 1 pagina
Door mij geschreven
Header PDF MIC
2
Dan is dit pagina 2
Met veel meer teksten en woorden.
感谢@mkl 的提示和技巧,这是我所做的:
一段使用 PDFMarkedContentExtractor 的 Java 代码,这只需要第一页,但我们可以将其应用于所有页面。 在代码下方,您可以找到 System.out 日志的输出。
ExtraMetaData emd = new ExtraMetaData(); //this my own class to carry the header and footer
PDFMarkedContentExtractor markedContentExtractor = new PDFMarkedContentExtractor();
markedContentExtractor.processPage(document.getPage(0));
List<PDMarkedContent> markedContents = markedContentExtractor.getMarkedContents();
for (Iterator iterator = markedContents.iterator(); iterator.hasNext();) {
PDMarkedContent pdMarkedContent = (PDMarkedContent) iterator.next();
System.out.println(pdMarkedContent.getTag()+" --> "+pdMarkedContent.getContents()+ " "+pdMarkedContent.getProperties());
COSDictionary pdmcProperties = pdMarkedContent.getProperties();
if (pdmcProperties.containsKey("Subtype")) {
COSBase cosBase = pdmcProperties.getDictionaryObject("Subtype");
if (((COSName)cosBase).getName().equalsIgnoreCase("Footer")) {
emd.setFooter(getContentAsString(pdMarkedContent));
}
if (((COSName)cosBase).getName().equalsIgnoreCase("Header")) {
emd.setHeader(getContentAsString(pdMarkedContent));
}
}
if (pdmcProperties.containsKey("Attached")) {
COSArray cosArray = (COSArray) pdmcProperties.getDictionaryObject("Attached");
for (COSBase cosBase2 : cosArray) {
if (((COSName)cosBase2).getName().equalsIgnoreCase("Bottom")) {
emd.setFooter(getContentAsString(pdMarkedContent));
}
if (((COSName)cosBase2).getName().equalsIgnoreCase("Top")) {
emd.setHeader(getContentAsString(pdMarkedContent));
}
}
}
}
输出
Artifact --> [-, , 1, , -, ] COSDictionary{COSName{Attached}:COSArray{[COSName{Top}]};COSName{Type}:COSName{Pagination};}
Artifact --> [ ] COSDictionary{COSName{Attached}:COSArray{[COSName{Bottom}]};COSName{Type}:COSName{Pagination};}
P --> [M, J, , -, , 2, 0, 1, 6, 2, 1, 7, 2, , /, , B, ] COSDictionary{COSName{MCID}:COSInt{0};}