【发布时间】:2018-06-26 00:48:45
【问题描述】:
我有一个包含大量 PDF 文件的文件夹。我需要获取匹配内容文件的文件名以及其中的特定文本 - Rotate 270,它定义了页面旋转。 Grep 的参数 anH 或 /dev/null 方法似乎不起作用,pdftotext 或 pdfgrep 也没有帮助,因为它不是我需要的页面上的任何可见或可搜索文本。 我可以得到“二进制文件 aaa.pdf 匹配”或这样的行(这不是页面上可见的文本!):
<</Filter/FlateDecode/Length 61>>stream4 595.19995]/MediaBox[0 0 841.92004 595.19995]/Parent 5 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/XObject<</img3 11 0 R>>>>/Rotate 270/Type/Page>>
怀疑有一种方法可以在 grep 获取它们之前释放不可打印的字节,或者在 grep 部分之前拆分文件名并在 grep 找到该行后重新组装,或者 sed 有一个简单的方法来实现这一点?
如何获取文件名和找到的行,类似于 grep 在常规文本文件中所做的那样?
【问题讨论】:
-
我不清楚您到底在问什么,但如果您想对 PDF 文件执行 grep,请查看 pdfgrep。 (在类似 Debian 的系统上,您可以使用
apt-get install pdfgrep安装它。) -
我知道 pdfgrep,它是用于其他目的。我不需要在 PDF 文档的页面上搜索可见(甚至可搜索)文本。我需要搜索要在文档上显示的对象的定义、页面定义、字体定义、图像定义等。
-
我认为您相信您在使用适当的查看器查看 PDF 时看到的文本存储“与常规文本文件大致相同”,以解释您的问题。 事实并非如此。纯文本可以在压缩对象中,使用一组标准编码中的任何一种进行编码加上调整,并存储在不同的部分中,交错使用绘图命令。
-
.. 也就是说,这令人困惑:“.. 其中的特定文本 - 旋转 270,它定义了页面旋转..”然后你声明你可以 查找文本“不是页面上可见的文本”。文本“Rotate 270”在页面上也不可见。或者,如果是,那么它不是 PDF 指令,而只是纯文本。
-
看看这篇文章:stackoverflow.com/a/29474423/501196 也许你可以将其中一个工具与 grep 结合起来。压缩对象流对于做你想做的事将是一个挑战。也许其中之一将允许您将所有二进制流编码为 Ascii85decode 或类似
标签: linux bash pdf grep binary