有没有一种方法可以使用grep的功能搜索pdf文件,而无需在Ubuntu中先转换为文本?
有没有一种方法可以使用grep的功能搜索pdf文件,而无需在Ubuntu中先转换为文本?
Answers:
安装软件包pdfgrep
,然后使用以下命令:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
最简单的方法是
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
也有一个递归标志。因此,这个答案也许可以简化为:pdfgrep -R pattern /path/
。即使它不是PDF,但如果遍历每个文件可能会不太有效。而且我注意到它与å,ä和ö等国际字符有关。
-n
选项是pdfgrep的专业版,因为它允许在输出中包括页码(可能有助于进一步处理)。
pattern
啊 什么{}
啊 +是怎么回事?初读时我不知道...所以我想转到手册页。
如果已poppler-utils
安装(Ubuntu Desktop上的默认设置),则可以即时对其进行“转换”并将其通过管道传递给grep
:
pdftotext my.pdf - | grep 'pattern'
这不会创建.txt文件。
pdftotext
是应写入的文件名。但是,按照惯例,工具通常允许您stdout
通过指定a -
而不是写入文件。同样,stdout
如果您完全省略这样的参数,则某些工具会默认写入(但是,如果不产生歧义,这并非总是可能的)。
没有。
pdf包含大量数据,其中一些文本,其中一些图片,其中一些真正神奇的花哨XYZ(例如.u3d文件)。这些块大多数时候都是压缩的(例如,平坦,请检查http://www.verypdf.com/pdfinfoeditor/compression.htm)。为了“ grep” .pdf,您必须将压缩反向,也就是提取文本。
您可以使用诸如pdf2text
grep这样的结果针对每个文件执行此操作,也可以运行“索引器”(查看xapian.org或lucene),以从.pdf文件中构建可搜索的索引,然后您就可以使用搜索了该索引器的引擎工具来获取pdf的内容。
但是,不可以,您无法生成grep
pdf文件,并且希望在不首先提取文本的情况下获得可靠的答案。
pdfgrep
存在(请参见上文),平的“否”是不正确的。
您可以strings
先将其通过管道传输:-
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
,就不需要cat
strings
或不太友善grep
。
尝试这个
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
用于打印线条,图案出现在pdf内
cd到包含pdf文件的文件夹,然后..
pdfgrep 'pattern' your.pdf
或者,如果您要搜索的不仅仅是一个pdf文件(例如,文件夹中的所有pdf文件)
pdfgrep 'pattern' `ls *.pdf`
要么
pdfgrep 'pattern' $(ls *.pdf)
ls
输出作为其他命令的输入不仅速度较慢,而且不是一个好主意。只要pdfgrep 'pattern' *.pdf
是够
在StackOverflow上有一个重复的问题。那里的人建议使用harish.venkarts的变体:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
与类似答案相比,这里的优势是--with-filename
grep 的标志。由于标准grep具有更多功能,因此它在某种程度上也优于pdfgrep。
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
我假设您的意思是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 {}
如果您只想搜索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