- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道这可能有点不寻常,但我想知道 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 文档,其中只包含一个包含单词 one two three four five
的短语。如果我在 Linux 终端中 cat
文件(或使用 vim
查看它),该 PDF 文件的内容如下所示:
%PDF-1.4
%����
2 0 obj
<</Filter/FlateDecode/Length 71>>stream
x�+�r
�24U�02I�2P0Q�n�
�F
!i\�y�
%��
%E��
i��E
i�e��!Y0Ů!\�\���
endstream
endobj
4 0 obj
<</Contents 2 0 R/Type/Page/Resources<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]/Font<</F1 1 0 R>>>>/Parent 3 0 R/MediaBox[0 0 595 842]>>
endobj
1 0 obj
<</Subtype/Type1/Type/Font/BaseFont/Helvetica/Encoding/WinAnsiEncoding>>
endobj
3 0 obj
<</Kids[4 0 R]/Type/Pages/Count 1/ITXT(2.1.7)>>
endobj
5 0 obj
<</Type/Catalog/Pages 3 0 R>>
endobj
6 0 obj
<</ModDate(D:20171216101023Z)/CreationDate(D:20171216101023Z)/Producer(iText 2.1.7 by 1T3XT)>>
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
<</Info 6 0 R/ID [<9e1d205d229e3d1b5b56354a7da26844><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;
}
我仍然有兴趣听听是否有可能做我最初尝试的事情。
最佳答案
您的天真方法——简单地查找特定编码的文本——通常行不通的原因有很多。
您要查找的文本,屏幕上显示的文本,是由某些内容流中的文本绘制指令绘制的。 (让我们忽略图形看起来像文本但使用 vector 或位图图形命令绘制的情况以及丢失或不准确的字体编码信息的情况。)
您要查找的文字不一定是由一条指令绘制的。例如,文本“Hello”可能使用两个连续的命令来编写:
(Hel) Tj (lo) Tj
不同的命令甚至不需要在内容流中相互跟随,它们可以分布在其中。
PDF 中的每种字体都可以对其字符串使用不同的编码,这些编码甚至不需要是标准编码,它们可以是由 PDF 创建程序即时创建的临时编码。
内容流可能(而且通常确实)需要过滤器进行解码,例如在上面的 PDF 中,对象 2 中的内容流需要 FlateDecode 过滤(实质上:解压缩)。
PDF 可能被加密(在这种情况下,更具体地说,字符串和流被加密);即使您可以在 PDF 查看器中轻松打开的 PDF 也可能使用默认密码进行加密(此技术用于编码权限)。
因此,要检查内容流的内容,您可能必须
在这个字符串中,您最终可以以一种天真的方式搜索文本。
关于java - 如何在 PDF (1.4) 字节数组中搜索目标字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47845441/
我的代码有一些问题。我正在尝试遍历包含许多 PDF 的 Drive 文件夹,然后将它们合并为一个文件。当我使用我的代码时,它只是为 Drive 文件夹中的最后一个 PDF 创建一个 PDF,而不是按预
我从 PDF Specification 获取了 PDF 规范中的最小 PDF 示例。 ,将其复制到记事本,将文件重命名为扩展名为 .pdf。 我可以用其他 PDF 查看器(PDF-XChange、S
感谢您在以下方面的帮助: 我有 2 个部分可访问的 PDF(包含标签),我想使用一些命令行工具(如 PDFtk 或 Ghostscript,或任何 Perl 模块)将它们连接起来: 我已经尝试使用 P
我想使用 ghostscript 将矢量 pdf 转换为光栅 pdf(即光栅化矢量 pdf)。但是即使我添加了解析参数 -r300,我也找不到合适的参数来执行此操作。 我使用的代码是-dSAFER -
我无法在 FAQ 中找到这个功能是否存在于 API 中,尽管它在书中提到作为潜在可用的东西。有没有人有任何实现此功能的经验? 最佳答案 在 This thread (日期为 2007 年 6 月)Pa
我要放文件sample.pdf在我的网站上,并希望使用 pdf.js 显示它.我想要的是显示我自己的文件,如 demo ,带有工具栏,放大/缩小等。到目前为止,我还不能这样做。 我确实检查了 hell
我知道这可能不是严格意义上的编程问题(也许是,我不知道)但我在尝试转换常规 pdf(带有超链接、书签、图像、嵌入字体等)时遇到了严重问题.) 转换为 PDF/A-1 格式。 当我用 pdfaPilot
这是 PDF.js 网站 https://github.com/mozilla/pdf.js 我正在搜索和阅读很多文章,大多数编码都是将 pdf 导入 pdf.js 并在浏览器上显示,我不明白是不是
谁能建议我如何将扫描图像转换为可搜索图像或如何将扫描 pdf 转换为可搜索 pdf? 很长一段时间以来,我一直陷入这种情况。 我已经在 ubuntu 中尝试过 pdfocr 应用程序,但没有成功。 最
作为我对客户端/服务器 pdf 签名研究的一部分,我测试了 itext pdf 延迟签名示例。不幸的是,我生成的 pdf 即合并空签名 pdf 和哈希值的输出显示无效签名。 我的代码片段如下 cla
我想将一个 PDF 页面插入到另一个已缩放的 PDF 页面中。我想使用 iTextSharp 来实现此目的。 我有一个矢量绘图,可以导出为单页 PDF 文件。我想将此文件添加到其他 PDF 文档的页面
作为我对客户端/服务器 pdf 签名研究的一部分,我测试了 itext pdf 延迟签名示例。不幸的是,我生成的 pdf 即合并空签名 pdf 和哈希值的输出显示无效签名。 我的代码片段如下 cla
我想为 Kindle 转换电子书。我尝试使用 Calibre 将具有复杂格式样式和图像的基于两种语言的基于文本的大型 PDF 电子书转换为适用于 Kindle 的 AZW3 电子书,并且还尝试了亚马逊
我在 Google Chrome 中显示 pdf 时遇到问题。问题是 Chrome 将 pdf 的某些页面显示为黑色。 启用 Chrome PDF 查看器时会发生这种情况。如果我禁用此插件并使用 Ad
我确信这个问题无处不在,尽管我似乎找不到答案。我希望我的 PDF 文档在 PDF 阅读器中显示时没有空白页,但随后在封面后打印空白页,这样打印出来的文档在右侧甚至左侧都有奇数页。还有其他人遇到过这个问
我需要自动裁剪 pdf 文件(去除白边)。到目前为止,我尝试了两种并不完美的工具: pdf裁剪 问题:它不会裁剪某些 pdf。 pdf-crop-margins 问题:有时它裁剪得太多(精细的细节)。
This PDF由几个源文件组成。其中五个是包含 alpha channel 的 PNG。一种是没有 alpha channel 的 PNG。最后一 block 是带有透明效果的 Photoshop
我的团队将内部 wiki 页面用于各种内容。这些页面是使用 MediaWiki 创建的。我想知道是否有任何方法可以将 wiki 页面转换为 PDF 格式。我必须用它来将用户文档转换为 PDF 格式,以
我希望能够从我可能在数据库或 xml 或任何其他结构化形式中拥有的数据生成高度图形化(也包含大量文本内容)的 PDF 文件。 目前,我们的平面设计师在将内容作为 MS Word 文档后,在 Photo
我正在寻找可以帮助我找到重复 PDF 的实用程序。问题:我有 1000 个 PDF 文件。有些是重复的。由于不同的文件名和文件大小的微小差异,它们不容易被检测到。是否有实用程序/算法/库可以帮助我找到
我是一名优秀的程序员,十分优秀!