如何使用 grep 搜索我的 PDF?
How to search my PDF with grep?
我遵循了此线程中的想法,但它不起作用。
https://unix.stackexchange.com/questions/6704/how-can-i-grep-in-pdf-files
pdftotext PercivalWalden.pdf - | grep 'Slepian'
pdftotext PercivalWalden.pdf - | grep 'Naive'
pdftotext PercivalWalden.pdf - | grep 'Filter'
我确定 'Filter' 在本书中至少出现了 100 次。
有什么想法吗?
如果您真的可以从 PDF 中 grep 一个给定的字符串(您可以 'see' 并在渲染或打印的 PDF 页面上阅读),即使有帮助pdftotext
,那你一定很幸运。
首先:您提供给 unix.stackexchange.com
的 link 的大部分建议都非常无知(最客气地说)。那里的大部分答案显然是由不熟悉那里大量 PDF 变体的人写的。
在您的情况下,您首先尝试在 pdftotext
的帮助下转换文件,将输出流式传输到 stdout.
有很多类型的 PDF pdftotext
根本无法提取文本。原因可能是(以下列表不完整):
您看到的"text"不是基于使用字体。它可能是由扫描或其他生产过程生成的大光栅图像,然后嵌入到 PDF 文件中 shell。这可能会使页面仅显示为文本字符串。
您看到的"text"不是基于使用字体。它可能是一系列小型矢量绘图(或小型光栅图像),在我们的眼睛和大脑看来看起来像文本字符串。
有很多软件应用程序可以将字体转换为所谓的 'outlines'。这种看似奇怪的行为的原因可能是:
- 规避许可问题(当某种字体不允许其嵌入时)。
- 对提取文本的尝试施加障碍。
- PDF 生成应用程序中的意外错误设置。
字体作为子集嵌入到PDF文件中(通过PDF生成软件——用户通常无法控制细节此操作)并使用 'custom' 编码,但文件未提供 toUnicode
table 将 字形 映射到 字符.
'Glyphs' 是在屏幕上绘制的每种字体中明确定义的 形状 。字形映射到计算机的字符——我们的眼睛仅 看到 这些形状,我们的大脑将这些形状转换为字符,而不需要 toUnicode
table。 pdftotext
等程序需要 toUnicode
table 将字形转换回字符。
您可以使用名为 pdffonts
的命令行实用程序来初步了解 PDF 文件使用的字体。 示例输出:
pdffonts paper-projectiris---final.pdf
name type encoding emb sub uni object ID
-------------------------- ------------ -------------- --- --- --- ---------
TCQJEF+CMCSC10 Type 1 Builtin yes yes no 96 0
VPAFLY+CMBX12 Type 1 Builtin yes yes no 97 0
CWAIXW+CMTI12 Type 1 Builtin yes yes no 98 0
OBMDLT+CMR12 Type 1 Builtin yes yes no 99 0
在这种情况下,文本提取(以及您的 grepping 字符串方法)应该有效:
- 即使名为
uni
的列(告诉 PDF 文件中是否嵌入了 toUnicode
地图)
对每种字体说 no
,encoding
列不包含 custom
,但包含 builtin
(意味着字形->字符映射随字体文件一起提供,这类型为 Type 1
.
总结一下: 如果无法访问您的 PDF 文件,就无法解释为什么您不能 "grep"您正在寻找的字符串!
我遵循了此线程中的想法,但它不起作用。 https://unix.stackexchange.com/questions/6704/how-can-i-grep-in-pdf-files
pdftotext PercivalWalden.pdf - | grep 'Slepian'
pdftotext PercivalWalden.pdf - | grep 'Naive'
pdftotext PercivalWalden.pdf - | grep 'Filter'
我确定 'Filter' 在本书中至少出现了 100 次。
有什么想法吗?
如果您真的可以从 PDF 中 grep 一个给定的字符串(您可以 'see' 并在渲染或打印的 PDF 页面上阅读),即使有帮助pdftotext
,那你一定很幸运。
首先:您提供给 unix.stackexchange.com
的 link 的大部分建议都非常无知(最客气地说)。那里的大部分答案显然是由不熟悉那里大量 PDF 变体的人写的。
在您的情况下,您首先尝试在 pdftotext
的帮助下转换文件,将输出流式传输到 stdout.
有很多类型的 PDF pdftotext
根本无法提取文本。原因可能是(以下列表不完整):
您看到的"text"不是基于使用字体。它可能是由扫描或其他生产过程生成的大光栅图像,然后嵌入到 PDF 文件中 shell。这可能会使页面仅显示为文本字符串。
您看到的"text"不是基于使用字体。它可能是一系列小型矢量绘图(或小型光栅图像),在我们的眼睛和大脑看来看起来像文本字符串。
有很多软件应用程序可以将字体转换为所谓的 'outlines'。这种看似奇怪的行为的原因可能是:
- 规避许可问题(当某种字体不允许其嵌入时)。
- 对提取文本的尝试施加障碍。
- PDF 生成应用程序中的意外错误设置。
字体作为子集嵌入到PDF文件中(通过PDF生成软件——用户通常无法控制细节此操作)并使用 'custom' 编码,但文件未提供
toUnicode
table 将 字形 映射到 字符.'Glyphs' 是在屏幕上绘制的每种字体中明确定义的 形状 。字形映射到计算机的字符——我们的眼睛仅 看到 这些形状,我们的大脑将这些形状转换为字符,而不需要
toUnicode
table。pdftotext
等程序需要toUnicode
table 将字形转换回字符。
您可以使用名为 pdffonts
的命令行实用程序来初步了解 PDF 文件使用的字体。 示例输出:
pdffonts paper-projectiris---final.pdf
name type encoding emb sub uni object ID
-------------------------- ------------ -------------- --- --- --- ---------
TCQJEF+CMCSC10 Type 1 Builtin yes yes no 96 0
VPAFLY+CMBX12 Type 1 Builtin yes yes no 97 0
CWAIXW+CMTI12 Type 1 Builtin yes yes no 98 0
OBMDLT+CMR12 Type 1 Builtin yes yes no 99 0
在这种情况下,文本提取(以及您的 grepping 字符串方法)应该有效:
- 即使名为
uni
的列(告诉 PDF 文件中是否嵌入了toUnicode
地图) 对每种字体说no
,encoding
列不包含custom
,但包含builtin
(意味着字形->字符映射随字体文件一起提供,这类型为Type 1
.
总结一下: 如果无法访问您的 PDF 文件,就无法解释为什么您不能 "grep"您正在寻找的字符串!