如何搜索多个pdf文件的内容?


226

如何在目录/子目录中搜索PDF文件的内容?我正在寻找一些命令行工具。似乎grep无法搜索PDF文件。


5
Grep无法使用,因为PDF是二进制格式,并且文本通常以多种方式压缩或编码。
mark stephens

4
这是一个GUI解决方案:Adobe Reader,请参见wikispaces.psu.edu/display/training/…–
Martin Thoma


3
Adobe Reader可以正常工作,但是不能建立索引;因此,如果您有很多文件,速度将会很慢。任何索引解决方案?
Ruby 2014年

Answers:


211

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

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

要使pdftotext输出到stdout,而不是文件,必须使用“-”。在--with-filename--label=选项将在grep的输出把文件名。可选--color标志很不错,它告诉grep使用终端上的颜色进行输出。

(在Ubuntu中,pdftotextxpdf-utils或提供poppler-utils。)

这种方法,使用pdftotextgrep,拥有一个优势pdfgrep,如果你想使用GNU的特点greppdfgrep不支持。注意:pdfgrep-1.3.x支持-C打印上下文行的选项。


1
@Kurt Pfeifle您进行的编辑“((-kp-Edit by -kp-)编辑)”不起作用,因为它grep过滤了打印的文件名。
拉斐尔·阿伦斯

@sjr不,虽然该pdfgrep解决方案非常适合快速,简单的搜索,但我经常想获得一些上下文信息,因为单行的效果不够好-因此,正如我在此答案中所添加的:例如,您可以添加-“ C5”选项在“您的模式”之前包含到输出的5行上下文– pdfgrep不支持此选项
Colin D Bennett

哦,这很酷,很高兴知道这样做有好处,即使它对大多数人而言并不那么明显
sjr

2
@sjr仅作记录:我使用的是Ubuntu 12.10 pdfgrep,它没有用,它报告了它无法处理的文件上的大量垃圾。另一方面,您的解决方案有所帮助。因此,请不要删除它,即使3年后它还是有帮助的!
阿里

我能够也使用它在Cygwin中,altough使其与参数的功能,我不得不做出“your_pattern”成为“$ 1”
Koshmaar

214

pdfgrep,它的功能恰如其名。

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

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

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

从1.3.0版开始,pdfgrep支持递归搜索。自Ubuntu 12.10(Quantal)起,此版本已在Ubuntu中可用。


1
从纳蒂(Ubuntu的11.04)向上(见packages.ubuntu.com/...
马丁托马

2
@pavon pdfgrep现在确实具有该递归选项,包括-R也遵循符号链接
Tobias Kienzler 2014年

30

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

Recoll还具有可行的命令行界面和Web浏览器界面


1
@Glutanimate如果您可以添加一个与原始问题有关的示例(用于搜索多个pdf的命令行工具),则将有所帮助(我也可能还有其他人):我也想看看如何执行通配符搜索以及如何搜索在当前目录包括所有子目录recoll / xapian在命令行中(非GUI)的外观如何?谢谢!
关于natty的坚果,2015年

@LeszekŻarna也许您可以发布测试过的示例?
关于natty的坚果,2015年

recoll 用户手册可能包含一些指点,但提供了相当的技术和“题外话”读...
坚果约整洁的

1
@nutty:recoll -t -q目录:pwdext :pdf'neuro *'-stackoverflow吃掉了pwd周围的反引号。
medoc

13

我的pdfgrep(1.3.0)的实际版本允许以下操作:

pdfgrep -HiR 'pattern' /path

进行时pdfgrep --help

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

它在我的Ubuntu上运行良好。


7

我做了这个破坏性的小脚本。玩得开心。

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
}

2
+1。但是$filename.您应该用管道代替它grep
拉斐尔·阿伦斯

3

我喜欢@sjr的答案,但是我更喜欢xargs与-exec。我发现xargs更通用。例如,使用-P时,我们可以利用多个CPU。

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

关于xargs并行处理能力的有趣观点。请注意,您的--label选项参数会从字面上 {},这是因为grep命令现在不再的情况下执行findexec
mklement0

2

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

也许这对您有帮助。

您可以在这里下载


将脚本放在注释中可能有用吗?
baxx

我尝试了您的脚本,结果比pdfgrep解决方案或sjr的单行脚本要慢得多,而且即使我按Ctrl-C终止它,也使我无法使用100%的CPU线程进行中。
杰森

2

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

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

2

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

它不仅可以处理PDF文档(例如Office文档和电影),而且作者声称它比更快pdfgrep

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

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

1

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

文件选项卡下的完整描述几乎涵盖了该工具支持的内容。

我将crgrep开发为开源工具。


Craig-您与该项目有联系吗?如果是这样,则应在答案中说明。我说这是因为您刚刚对其他两个老问题发表了几乎相同的答案……
Stephen C

更新后的帖子以澄清我是crgrep的作者
Craig

1

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

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

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


当与ag github.com/ggreer/the_silver_searcher结合使用时,就可以做到这一点 。能够解析微秒级的Gb。终身平面文件
NVRM

0

您需要诸如pdf2text之类的一些工具才能首先将pdf转换为文本文件,然后在文本内部进行搜索。(您可能会错过一些信息或符号)。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.