【问题标题】:How to search contents of multiple pdf files?如何搜索多个pdf文件的内容?
【发布时间】:2011-06-06 07:39:02
【问题描述】:

如何在目录/子目录中搜索 PDF 文件的内容?我正在寻找一些命令行工具。 grep好像不能搜索PDF文件。

【问题讨论】:

标签: linux pdf full-text-search grep debian


【解决方案1】:

pdfgrep,正如它的名字所暗示的那样。

pdfgrep -R 'a pattern to search recursively from path' /some/path

我已经将它用于简单的搜索并且效果很好。

(在 Debian、Ubuntu 和 Fedora 中有软件包。)

自 1.3.0 版起,pdfgrep 支持递归搜索。自 Ubuntu 12.10 (Quantal) 起,该版本在 Ubuntu 中可用。

【讨论】:

  • 从 Natty (Ubuntu 11.04) 向上(参见packages.ubuntu.com/…
  • @pavon pdfgrep 现在确实具有该递归选项,包括 -R 也可以遵循符号链接
  • 我在 Debian 10 上遇到了这个工具的问题。它没有找到一些可以用 evince 找到的字符串。结果证明是非常不可靠的。
  • @Ohumeronen 七年后,问题依然存在。结果似乎取决于如何创建 pdf。所以 pdftotext -raw (虽然已弃用)似乎有所帮助。
【解决方案2】:

您的发行版应提供一个名为 pdftotext 的实用程序:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

“-”是 pdftotext 输出到标准输出所必需的,而不是文件。 --with-filename--label= 选项会将文件名放在 grep 的输出中。 可选的 --color 标志很好,它告诉 grep 在终端上使用颜色输出。

(在 Ubuntu 中,pdftotext 由包 xpdf-utilspoppler-utils 提供。)

如果您想使用pdfgrep 不支持的GNU grep 的功能,这种方法使用pdftotextgreppdfgrep 具有优势。 注意:pdfgrep-1.3.x 支持-C 选项用于打印上下文行。

【讨论】:

  • @Kurt Pfeifle 您所做的编辑“(由 -kp- 编辑)”不起作用,因为 grep 过滤了打印的文件名。
  • @sjr 不,虽然pdfgrep 解决方案非常适合快速和简单的搜索,但我通常想获得一些上下文,因为单行不会有足够的帮助 - 所以我添加到这个答案中:例如,您可以在“您的模式”之前添加 -C5 选项以在输出中包含 5 行上下文 - pdfgrep 不支持此
  • 哦,这很酷,很高兴知道这样做有好处,尽管它对大多数人来说并不那么明显
  • @sjr 仅作记录:我使用的是 Ubuntu 12.10,pdfgrep 没用,它报告了大量无法处理的文件垃圾。另一方面,您的解决方案有所帮助。所以请不要删除它,即使在 3 年后它仍然有用!
  • 我也可以在 cygwin 中使用它,虽然要让它成为一个带参数的函数,但我不得不让“your_pattern”变成 '$1'
【解决方案3】:

Recoll 是一款出色的 Unix/Linux 全文 GUI 搜索应用程序,支持包括 PDF 在内的数十种不同格式。它甚至可以将查询的确切页码和搜索词传递给文档查看器,从而允许您直接从其 GUI 跳转到结果。

Recoll 还带有一个可行的命令行界面和一个web-browser interface

【讨论】:

  • @Glutanimate 如果您可以添加与原始问题 (用于搜索多个 pdf 的命令行工具): 我还想看看如何执行通配符搜索以及如何搜索当前目录,包括所有子目录。在命令行(非 GUI)中使用 recoll / xapian 会怎样?谢谢!
  • @LeszekŻarna 也许您可以发布您测试的示例?
  • recoll user manual 可能包含一些指针,但提供了相当技术性和“离题”的阅读...
  • @nutty: recoll -t -q dir:pwd ext:pdf 'neuro*' -- stackoverflow 吃掉了 pwd 周围的反引号。
【解决方案4】:

我的 pdfgrep (1.3.0) 的实际版本允许:

pdfgrep -HiR 'pattern' /path

在做pdfgrep --help时:

  • H:打印每个匹配的文件名。
  • i:忽略大小写区别。
  • R:递归搜索目录。

它在我的 Ubuntu 上运行良好。

【讨论】:

    【解决方案5】:

    还有一个名为ripgrep-all 的实用程序,它基于ripgrep

    它可以处理的不仅仅是PDF文档,比如Office文档和电影,作者claimspdfgrep更快。

    递归搜索当前目录的命令语法,第二个仅限于PDF文件:

    rga 'pattern' .
    rga --type pdf 'pattern' .
    

    【讨论】:

      【解决方案6】:

      我制作了这个破坏性小脚本。玩得开心。

      function pdfsearch()
      {
          find . -iname '*.pdf' | while read filename
          do
              #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
              pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
              # remove it!  rm -f "$filename."
          done
      }
      

      【讨论】:

      • +1。但是你应该将它而不是$filename. 输入grep
      【解决方案7】:

      我喜欢@sjr 的回答,但我更喜欢 xargs 和 -exec。我发现 xargs 更通用。例如,使用 -P,我们可以在有意义的情况下利用多个 CPU。

      find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
      

      【讨论】:

      • 关于xargs'并行处理能力的有趣点。请注意,您的--label 选项参数将字面上 {},因为grep 命令现在不再在findexec 的上下文中执行。
      【解决方案8】:

      我遇到了同样的问题,因此我编写了一个脚本,该脚本在指定文件夹中的所有 pdf 文件中搜索字符串并打印与查询字符串匹配的 PDF 文件。

      也许这会对你有所帮助。

      你可以下载它here

      【讨论】:

      • 将脚本放在评论中可能有用吗?
      • 我试过你的脚本,结果它比pdfgrep 解决方案或 sjr 的单线慢得多,即使在我 Ctrl- C 终止它。
      【解决方案9】:

      如果您想使用 pdftotext 查看文件名,请使用以下命令:

      find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 
      

      【讨论】:

        【解决方案10】:

        首先将所有 pdf 文件转换为文本文件:

        for file in *.pdf;do pdftotext "$file"; done
        

        然后照常使用grep。这特别好,因为当您有多个查询和大量 PDF 文件时它会很快。

        【讨论】:

        【解决方案11】:

        有一个开源的公共资源 grep 工具 crgrep 可以搜索 PDF 文件以及其他资源,例如嵌套在档案中的内容、数据库表、图像元数据、POM 文件依赖项和 Web 资源 - 以及这些资源的组合,包括递归搜索。

        “文件”选项卡下的完整说明几乎涵盖了该工具支持的内容。

        我将 crgrep 开发为开源工具。

        【讨论】:

        • Craig - 你和那个项目有联系吗?如果是这样,您应该在回答中说明。我这样说是因为您刚刚发布了对另外两个老问题的几乎相同的答案...
        • 更新帖子澄清我是 crgrep 的作者
        【解决方案12】:

        您需要一些像 pdf2text 这样的工具来首先将您的 pdf 转换为文本文件,然后在文本中进行搜索。 (您可能会错过一些信息或符号)。

        如果您使用的是编程语言,则可能有为此目的编写的 pdf 库。例如http://search.cpan.org/dist/CAM-PDF/ 用于 Perl

        【讨论】:

          【解决方案13】:

          尝试在上述简单脚本中使用“acroread”

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-28
            • 1970-01-01
            • 2011-09-25
            • 1970-01-01
            • 2015-11-13
            相关资源
            最近更新 更多