【问题标题】:Grep show filename and found line for binary files (PDF)Grep 显示二进制文件的文件名和找到的行 (PDF)
【发布时间】: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


【解决方案1】:

我没有包含该字符串的 pdf 文件,但您可以尝试

identify -verbose somefile.pdf | grep 'Rotate 270'

identify 是 ImageMagick 包的一部分。

你也可以试试蛮力方法:-)

strings somefile.pdf | grep 'Rotatae 270'

【讨论】:

  • 它不会给出必要的结果 - 匹配文件名和与 Rotate 270 所在的所有其他参数的确切行;需要看看 Rotate 270 是如何应用的。而且 ImageMagick 的依赖关系有点重,因为它只是在无头机器上获得如此简单的结果。然后来自 poppler utils 的 pdfinfo 会更轻一些。不过,谢谢,当我需要在同一台机器上进行更繁重的图像分析时,我会考虑它。
  • @uldics 用另一个选项更新了答案。
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多