有没有办法在搜索模式的PDF中获取页码?

时间:2016-01-06 05:02:11

标签: linux bash pdf terminal pdf-generation

我有一个名为test.pdf的PDF,我需要在该PDF中搜索文本My name

通过使用这个脚本,我可以完成这项工作:

pdftotext test.pdf - | grep 'My name'

有没有办法让网页编号到终端本身的文字“我的名字”?

1 个答案:

答案 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解析器提取它。