如何在 PDF 文件中使用 grep?

Der*_*unk 207 grep search pdf

有没有办法使用 grep 搜索 PDF 文件,而无需先在 Ubuntu 中转换为文本?

enz*_*tib 226

安装包pdfgrep,然后使用命令:

find /path -iname '*.pdf' -exec pdfgrep pattern {} +
Run Code Online (Sandbox Code Playgroud)

——————

最简单的方法:

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,我检查了 pdfgrep 的来源,它使用 poppler 从 pdf 中提取字符串。几乎与@wag 的回答完全一样,只是逐页而不是整个文档。 (8认同)
  • 这也适用于 mac osx (Mavericks)。使用 brew 安装它。简单的。谢谢。 (7认同)
  • `pdfgrep` 也有一个递归标志。所以这个答案也许可以简化为:`pdfgrep -R pattern /path/`。尽管如果它遍历每个文件,即使它不是 PDF,它的效果也可能会降低。我注意到它有国际字符问题,例如 å、ä 和 ö。 (7认同)
  • 如果这个答案解释了命令的哪些位是按字面复制的,哪些是占位符,那么它会更容易使用。什么是“模式”?什么是“{}”?`+` 是怎么回事?我在第一次阅读时不知道......所以我去看看手册页,我想。 (4认同)
  • @MarkAmery 这个答案不必要地复杂,因为他是“find”。用法很简单:“pdfgrep 'pattern' file.pdf”。“{}”只是从“find”中放入文件名的一种方法。 (3认同)
  • 由于 pdfgrep 相当慢,您可以通过使用并行查找来提高速度: `find . -type f -iname \*.pdf -print0 | xargs -0 -P 4 -L 1 pdfgrep -H -n 模式`。这显然取决于 CPU 的数量和可用 IO 的数量。 (2认同)

wag*_*wag 73

如果您已poppler-utils安装(Ubuntu 桌面上的默认设置),您可以即时“转换”它并将其通过管道传输到grep

pdftotext my.pdf - | grep 'pattern'
Run Code Online (Sandbox Code Playgroud)

这不会创建 .txt 文件。

  • @akira OP 可能意味着“无需在查看器中打开 PDF 并导出为文本” (19认同)
  • @akira 好吧,我已经说了我认为他可能的意思;他不想在处理之前导出为文本。我非常怀疑他对以任何方式转换为文本的 *any* 命令有问题;没有理由不这样做 (6认同)
  • @akira 你在哪里看到“仅限 grep”? (5认同)
  • @sherrellbc `pdftotext` 的第二个参数是它应该写入的文件名。但是,按照惯例,工具通常允许您通过指定一个 `-` 来写入 `stdout` 而不是写入文件。类似地,如果您完全省略这样的参数,某些工具会默认写入`stdout`(但如果不产生歧义,这并不总是可能的)。 (2认同)

小智 24

pdfgrep正是为此目的而编写的,并且在 Ubuntu 中可用。

它试图与大多数兼容grep并因此提供“grep 的力量”,专门用于 PDF。这包括常见的 grep 选项,例如--recursive,--ignore-case--color

与此相反pdftotext | grep,pdfgrep可以输出匹配的页面数在性能方法,一般要快,当它没有搜索整个文档(如--max-count--quiet)。

基本用法是:

pdfgrep PATTERN FILE..
Run Code Online (Sandbox Code Playgroud)

PATTERN您的搜索字符串和FILE文件名列表(或 shell 中的通配符)在哪里。

有关更多信息,请参阅联机帮助页


aki*_*ira 9

不。

pdf 由数据块组成,其中一些是文本,一些是图片,还有一些是非常神奇的 XYZ(例如 .u3d 文件)。这些块大部分时间都是压缩的(例如,扁平,检查http://www.verypdf.com/pdfinfoeditor/compression.htm)。为了“grep”一个.pdf,你必须反转压缩,也就是提取文本。

您可以使用诸如pdf2text和 grep 结果之类的工具对每个文件执行此操作,也可以运行“索引器”(查看xapian.orglucene),它会从 .pdf 文件中构建可搜索的索引,然后您可以使用搜索该索引器的引擎工具来获取pdf的内容。

但是不,您不能grep先提取文本,就不能pdf 文件并希望得到可靠的答案。

  • 考虑到 `pdfgrep` 存在(见上文),平面“否”是不正确的。 (10认同)
  • @JonathanCross,考虑到这个问题说“使用 grep 的力量,而不先转换为文本”,一个简单的“不”*是*正确的。 (3认同)

小智 7

Recoll可以搜索 PDF。它不支持正则表达式,但它有许多其他搜索选项,因此它可能适合您的需求。


use*_*610 7

StackOverflow 上有一个重复的问题。那里的人提出了 harish.venkarts 答案的变体:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Run Code Online (Sandbox Code Playgroud)

与这里的类似答案相比,这里的优势是--with-filenamegrep的标志。这在某种程度上也优于 pdfgrep,因为标准 grep 具有更多功能。

/sf/ask/325040691/


小智 5

查看支持在 PDF 文件中搜索的常用资源 grep 工具crgrep

它还允许搜索其他资源,如嵌套在档案中的内容、数据库表、图像元数据、POM 文件依赖项和 Web 资源——以及这些的组合,包括递归搜索。