2011-01-10 137 views
174

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

+4

由于PDF是一种二进制格式,因此Grep不会工作,并且文本通常以各种方式进行压缩或编码。 – 2011-01-10 07:37:13

+2

这是一个GUI解决方案:Adobe Reader,请参阅https://wikispaces.psu.edu/display/training/Search+for+Text+in+Multiple+PDFs+with+Adobe+Reader – 2012-08-01 13:44:55

+2

相关:http:// unix .stackexchange.com/questions/6704/grep-pdf-files – Flow 2013-06-22 12:59:31

回答

157

你的分配应提供一个名为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提供。)

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

+3

这可以工作,但不会显示匹配的文件名。任何想法? – 2012-11-30 16:35:09

+1

@Kurt Pfeifle由于`grep`过滤打印的文件名,编辑“(由-kp-编辑)”不起作用。 – 2013-08-13 09:07:43

+0

@sjr否,而`pdfgrep`解决方案对于真正快速和简单的搜索是很好的,通常我想获得一些上下文,因为单行不会有足够的帮助 - 所以添加到此答案中:例如,你可以在“你的模式”之前添加-C5选项,以包括5行上下文到输出 - pdfgrep不支持这个 – 2013-10-14 18:58:59

0

你需要一些工具,如pdf2text首先将你的pdf转换成文本文件,然后在文本内搜索。 (你可能会错过一些信息或符号)。

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

164

了一个简单的脚本中使用“acroread”有pdfgrep,这不正是它的名字一样。

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

我用它进行简单的搜索,它工作正常。

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

自版本1.3.0 pdfgrep支持递归搜索。此版本自Ubuntu 12.10(Quantal)起可用于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

我有同样的问题,因此我写了一个脚本,它会搜索指定文件夹中的所有PDF文件的字符串和打印PDF文件至极匹配的查询字符串。

也许这对你会有帮助。

你可以下载here

2

如果你想看看下面的命令与pdftotext使用的文件名:

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

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

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

1

有一个开放源码的公共资源的grep工具crgrep其中的PDF文件,还包括其他资源,比如内容嵌套在档案馆,数据库表,图像元数据,POM文件相关性和网络资源的范围内搜索 - 这些包括递归和组合搜索。

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

我开发了crgrep作为开源工具。

9

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

pdfgrep -HiR 'pattern' /path 

在做pdfgrep --help

  • H:打印的文件名每场比赛。 i:忽略大小写区分。
  • R:递归搜索目录。

它在我的Ubuntu上运行良好。

2

我喜欢@ sjr的回答,但我更喜欢xargs vs -exec。我发现xargs更通用。例如在-P的情况下,我们可以利用多个CPU来实现这一点。

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

首先转换您的所有PDF文件到文本文件:

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

然后用grep正常。这是非常好的,因为当你有多个查询和大量的PDF文件时它很快。