我有一个名为test.pdf
的PDF,我需要在该PDF中搜索文本My name
。
通过使用这个脚本,我可以完成这项工作:
pdftotext test.pdf - | grep 'My name'
有没有办法让网页编号到终端本身的文字“我的名字”?
答案 0 :(得分:4)
如果您只想要线性页码(而不是页面上显示的数字),则可以在搜索文本时计算换页字符。 pdftotext
在每个页面的末尾放置一个换页,因此文本前的换页数比文本所在的(线性)页码少一个。 (或者左右。有时PDF文件不是它们看起来的样子。)
以下内容应该有效:
pdftotext test.pdf - |
awk -vRS=$'\f' -vNAME="My name" \
'index($0,NAME){printf "%d: %s\n", NR, NAME;}'
如果要扫描多个模式,以下稍微复杂的解决方案将非常有用。与上面的简单解决方案不同,即使相同的模式在同一页面上匹配两次,每个模式匹配也会给你一行:
pdftotext test.pdf - |
grep -F -o -e $'\f' -e 'My name' |
awk 'BEGIN{page=1} /\f/{++page;next} 1{printf "%d: %s\n", page, $0;}'
您可以在grep
命令中添加任意数量的模式(通过添加另一个-e string
参数)。 -F
会使其与完全匹配的字符串匹配,但这不是必需的;你可以使用-E
和正则表达式。 awk脚本假定所有匹配都是表单提要或匹配的字符串,这是grep的-o
选项所能获得的。
如果您正在寻找短语,您应该知道它们可能在中间有换行符(甚至分页符)。关于分页符,你可以做的事情不多,但是如果你将对index
的调用更改为正则表达式搜索,那么第一个(纯awk)解决方案将处理换行符,并编写正则表达式[[:space::]]+
替换原始短语中的每个空格:
pdftotext test.pdf - |
awk -vRS=$'\f' \
'/My[[:space:]]+Name/{printf "%d: %s\n", NR, "My Name";}'
理论上,您可以提取可见的页码(或#34;页面标签"因为它被称为),但许多PDF文件不保留此元数据,您需要一个真正的PDF解析器提取它。