如何在PDF文件中使用grep?


135

有没有一种方法可以使用grep的功能搜索pdf文件,而无需在Ubuntu中先转换为文本?


1
我认为您需要解析pdf2text才能得到一些有用的结果...
Johan


1
对于那些通过搜索来到这里的人:如果您愿意先将其转换为文本文件,请查看如何搜索多个pdf文件的内容?
Martin Thoma

Answers:


135

安装软件包pdfgrep,然后使用以下命令:

find /path -iname '*.pdf' -exec pdfgrep pattern {} +

——————

最简单的方法是

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 

5
这也适用于mac osx(Mavericks)。使用brew安装它。简单。谢谢。
mikiemorales 2014年

7
出于好奇,我检查了pdfgrep的来源,并使用poppler从pdf中提取字符串。几乎完全与@wag的答案完全页面相关,而不是整个文档。
Andrew Martin

4
pdfgrep也有一个递归标志。因此,这个答案也许可以简化为:pdfgrep -R pattern /path/。即使它不是PDF,但如果遍历每个文件可能会不太有效。而且我注意到它与å,ä和ö等国际字符有关。
罗万尼

1
实际上,该-n选项是pdfgrep的专业版,因为它允许在输出中包括页码(可能有助于进一步处理)。
JepZ

4
如果它解释了命令的哪些位应原样复制以及哪些是占位符,则此答案将更易于使用。什么pattern啊 什么{}啊 +是怎么回事?初读时我不知道...所以我想转到手册页。
Mark Amery

56

如果已poppler-utils安装(Ubuntu Desktop上的默认设置),则可以即时对其进行“转换”并将其通过管道传递给grep

pdftotext my.pdf - | grep 'pattern'

这不会创建.txt文件。


1
所以..您在提取grep文本之前先提取了文本,这意味着答案为“否”。
akira

18
@akira OP可能意味着“无需在查看器中打开PDF并导出到文本”
Michael Mrozek

5
@akira在哪里看到“仅grep”?
Michael Mrozek

6
@akira好吧,我已经说了我想他可能是什么意思;他不想在处理文本之前将其导出。我非常怀疑他的任何以任何方式转换为文本的命令都存在问题。没有理由不这样做
Michael Mrozek

2
@sherrellbc的第二个参数pdftotext是应写入的文件名。但是,按照惯例,工具通常允许您stdout通过指定a -而不是写入文件。同样,stdout如果您完全省略这样的参数,则某些工具会默认写入(但是,如果不产生歧义,这并非总是可能的)。
Joost

11

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

它试图与大多数产品兼容grep,从而提供“ grep的力量”,仅适用于PDF。这包括常见的grep选项,例如--recursive--ignore-case--color

与相比pdftotext | grep,pdfgrep可以以高性能的方式输出匹配项的页码,并且在不必搜索整个文档(例如--max-count--quiet)时通常更快。

基本用法是:

pdfgrep PATTERN FILE..

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

有关更多信息,请参见手册


7

没有。

pdf包含大量数据,其中一些文本,其中一些图片,其中一些真正神奇的花哨XYZ(例如.u3d文件)。这些块大多数时候都是压缩的(例如,平坦,请检查http://www.verypdf.com/pdfinfoeditor/compression.htm)。为了“ grep” .pdf,您必须将压缩反向,也就是提取文本。

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

但是,不可以,您无法生成greppdf文件,并且希望在不首先提取文本的情况下获得可靠的答案。


5
考虑到pdfgrep存在(请参见上文),平的“否”是不正确的。
乔纳森·克罗斯

6

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


5

您可以strings先将其通过管道传输:-

cat file.pdf | strings | grep <...etc...>

8
只需使用strings file.pdf | grep <...>,就不需要cat
phunehehe 2011年

是的-我的想法似乎可以更好地与视频流配合使用... :-)
Andy Smith,

12
如果文本被压缩,将无法正常工作,这在大多数情况下都是如此。
akira

6
即使文本未压缩,也通常是很小的句子(甚至不一定是整个单词!)与格式信息很好地混合在一起。对strings或不太友善grep
Jander

您能想到另一个为什么不能使用字符串的原因吗?我发现使用字符串在某些PDF上有效,但在其他PDF上无效。
小时制,2015年

3

看一下通用资源grep工具crgrep,它支持在PDF文件中搜索。

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


2

尝试这个

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
    pdftotext "$i" - | grep pattern; done

用于打印线条,图案出现在pdf内


2

cd到包含pdf文件的文件夹,然后..

pdfgrep 'pattern' your.pdf

或者,如果您要搜索的不仅仅是一个pdf文件(例如,文件夹中的所有pdf文件)

pdfgrep 'pattern'  `ls *.pdf`

要么

pdfgrep 'pattern' $(ls *.pdf)

为什么在地球上为什么使用ls将文件名放在参数中?使用ls输出作为其他命令的输入不仅速度较慢,而且不是一个好主意。只要pdfgrep 'pattern' *.pdf是够
phuclv

1

在StackOverflow上有一个重复的问题。那里的人建议使用harish.venkarts的变体:

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

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

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files


我认为最好将它留在您所指的类似答案中作为评论(或编辑)。
伯恩哈德

0

这是在当前目录中搜索pdf的快速脚本:

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "usage $0 VALUE" 1>&2
  exit 1
fi

echo 'SEARCH IS CASE SENSITIVE' 1>&2

find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;

0

我假设您的意思是tp不会将其转换为磁盘,您可以将其转换为stdout,然后使用进行grep pdftotext。在没有任何转换的情况下获取pdf并不是一种实际的方法,因为PDF它主要是二进制格式。

在目录中:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {}  - | grep "keyword"

或在目录及其子目录中:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {}  - | grep "keyword"

另外,由于某些pdf扫描是扫描的,因此它们首先必须是OCRed。我写了一种非常简单的方法来搜索所有无法grep编辑的pdf 并对其进行OCR。

我注意到,如果pdf文件没有任何字体,通常是无法搜索的。所以知道这一点我们可以使用pdffonts

的前2行pdffonts是表格标题,因此,当文件可搜索时,输出多于两行,因此我们可以创建:

gedit check_pdf_searchable.sh

然后贴上

#!/bin/bash 
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi

然后使其可执行

chmod +x check_pdf_searchable.sh

然后在目录中列出所有不可搜索的pdf:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}

或在目录及其子目录中:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}

0

如果您只想搜索pdf名称/属性...或未经压缩或编码的简单字符串,则strings可以使用以下方法

grep -a STRING file.pdf
cat -v file.pdf | grep STRING

来自grep --help

      --binary-files=TYPE   assume that binary files are TYPE;
                            TYPE is 'binary', 'text', or 'without-match'
  -a, --text                equivalent to --binary-files=text

cat --help

  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB

0

如果您使用的是Gnome,则可能需要gpdf!如果您不使用Gnome,请选中复选框。它具有CLI pdf查看器列表。然后,您可以使用它grep来找到一些模式。

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.