我知道这可能有点不寻常,但是我想了解一下PDF文档(字节数组)是否包含特定文本.我使用iText库v2.1.7在Java中自己创建了文档,该库可生成符合PDF 1.4规范的文档.
我最初的天真尝试是这样的:
byte[] target = "the target text".getBytes("UTF-8");
int index = Bytes.indexOf(pdfBytes, target); // Guava lib
System.out.println( index ); // always -1 (not found)
对于这些类型的文档如何编码以弄清楚我需要做什么,我只是不够了解.我想我真正需要找出的是在转换为字节时需要在目标文本上使用哪种编码,以使其与PDF使用的编码匹配.
我创建了一个小的PDF文档样本,除了一个带有单词一二三四五的短语外,什么都没有.如果我在Linux终端中放置该文件(或使用vim进行查看),则该PDF文件的内容将如下所示:
%PDF-1.4
%????
2 0 obj
<>stream
x?+?r
?24U?02I?2P0Q?n?
?F
!i\?y?
%??
%E??
i??E
i?e??!Y0?!\?\???
endstream
endobj
4 0 obj
<>>>/Parent 3 0 R/MediaBox[0 0 595 842]>>
endobj
1 0 obj
<>
endobj
3 0 obj
<>
endobj
5 0 obj
<>
endobj
6 0 obj
<>
endobj
xref
0 7
0000000000 65535 f
0000000309 00000 n
0000000015 00000 n
0000000397 00000 n
0000000152 00000 n
0000000460 00000 n
0000000505 00000 n
trailer
<<7bf1bdf9e8d048c5795c7785954d9360>]/Root 5 0 R/Size 7>>
startxref
615
%%EOF
其中某些字符编码在复制和粘贴过程中无法正确翻译,因此,如果您复制并保存在那里看到的内容,则会得到损坏的PDF. Here’s a link到该PDF的副本.
我尝试将目标字符串编码为各种编码,例如CP-1252和WinAnsiEncoding,但是这些是无法识别的字符集.
我原本认为这不会给我带来很多麻烦,但是我还无法弄清楚该怎么做.我确实有一种变通方法,可以获得相同的结果,但这是专门针对iText库的解决方案,即不是在PDF字节数组中搜索文本的通用解决方案.
如果使用iText解析要搜索的字节数组,则可以遍历PDF的每一页并提取文本:
private static boolean doesPDFContain(byte[] pdf, String text) throws Exception {
PdfReader reader = new PdfReader(pdf);
int numPages = reader.getNumberOfPages();
PdfTextExtractor extractor = new PdfTextExtractor(reader);
for (int i=1; i<=numPages; i++) {
if ( extractor.getTextFromPage(i).contains(text) ){
return true;
}
}
return false;
}
我仍然会对是否有可能做我最初尝试的事情感兴趣.