it-swarm.cn

如何在PDF=文件中?

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

160
Dervin Thunk

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

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

——————

最简单的方法是:

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
164
enzotib

如果你有 poppler-utils安装(在Ubuntu桌面上是默认设置),您可以即时对其进行“转换”并将其通过管道传递到grep

pdftotext my.pdf - | grep 'pattern'

这不会创建.txt文件。

63
wag

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

它尽量与grep兼容,从而提供“ grep的力量”,仅适用于PDF。其中包括常见的grep选项,例如--recursive--ignore-case 要么 --color

pdftotext | grep,pdfgrep可以以一种高性能的方式输出匹配项的页码,并且在不必搜索整个文档时(例如--max-count 要么 --quiet)。

基本用法是:

pdfgrep PATTERN FILE..

其中PATTERN是您的搜索字符串,而FILE是文件名列表(或Shell中的通配符)。

有关更多信息,请参见 manpage

16
hpdeifel

没有。

Pdf由数据块组成,其中一些是文本,一些是图片,而另一些则是真正神奇的XYZ(例如.u3d文件)。这些块大多数时候都是压缩的(例如,压缩,检查 http://www.verypdf.com/pdfinfoeditor/compression.htm )。为了“ grep” .pdf,您必须反转压缩,也就是提取文本。

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

但是,不能,您不能grep个pdf文件,并且希望在没有首先提取文本的情况下获得可靠的答案。

7
akira

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

6
user39336

您可以先通过strings将其传送:

cat file.pdf | strings | grep <...etc...>
4
Andy Smith

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

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

3
Craig

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

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

相对于此处类似答案的优势是--with-filename grep的标志。这也比pdfgrep好一点,因为标准grep具有更多功能。

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

2
user7610

尝试这个

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

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

2
harish.venkat

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

pdfgrep 'pattern' your.pdf

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

pdfgrep 'pattern'  `ls *.pdf`

要么

pdfgrep 'pattern' $(ls *.pdf)
2
Rasmuss Rall

这是在当前目录中搜索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
Nico

如果您使用的是Gnome,则可能需要gpdf!如果您不使用Gnome,请检查 this 。它具有CLI pdf查看器列表。然后,您可以使用grep查找某种模式。

0
Dharmit

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

在目录中:

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

或在目录及其子目录中:

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

另外,因为某些pdf是扫描,所以它们需要首先是OCRed。我写了一种非常简单的方法来搜索所有无法greped的pdf并对其进行OCR。

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

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
Eduard Florinescu

如果您只想搜索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
phuclv