如何使用 grep 搜索我的 PDF



我已经遵循了这个线程的想法,但它不起作用。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'

我确信"过滤器"在这本书中至少出现了100次。

有什么想法吗?

如果您真的可以从 PDF 中 grep 给定的字符串(您可以在渲染或打印的 PDF 页面上"看到"和阅读),即使借助 pdftotext ,那么您一定非常幸运。

首先:您提供给unix.stackexchange.com的链接中的大多数建议都是非常不知情的(最礼貌地说)。那里的大多数答案显然都是由不熟悉大量PDF变体的人写的。

在您的情况下,您首先尝试在pdftotext的帮助下转换文件,将输出流式传输到标准输出

有许多类型的 PDF pdftotext根本无法提取文本。造成这种情况的原因可能是(下面的列表不完整):

  1. 您看到的"文本"不是基于使用字体。它可能是由扫描或其他生产过程生成的一个大光栅图像,然后嵌入到PDF文件外壳中。这可能会使页面仅显示为文本字符串。

  2. 您看到的"文本"不是基于使用字体。它可能是一系列小矢量图(或小光栅图像),在我们的眼睛和大脑中看起来只是文本字符串。

    有许多软件应用程序确实将字体转换为所谓的"轮廓"。这种看似奇怪的行为的原因可能是:

    • 规避许可问题(当某种字体不允许其嵌入时)。
    • 对提取文本的尝试施加障碍。
    • PDF 生成应用程序中的设置意外错误。
       
  3. 字体作为子集嵌入在PDF文件中(由PDF生成软件 - 用户通常无法控制此操作的细节)并使用"自定义"编码,但该文件不提供toUnicode表来将字形映射到字符

    "字形"是在屏幕上绘制的每种字体中定义明确的形状。字形映射到计算机的字符 - 我们的眼睛只看到这些形状,我们的大脑将它们转换为字符,而不需要toUnicode表。像pdftotext这样的程序需要一个toUnicode表来反转字形的转换回字符。


您可以使用名为 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

在这种情况下,文本提取(以及字符串的 greping 方法)应该有效:

  • 即使名为 uni 的列(判断 PDF 文件中是否嵌入了toUnicode地图)表示no对于每种字体,encoding列不包含custom,而是builtin(意味着字形>字符映射随字体文件一起提供,字体文件的类型为 Type 1

总结一下:如果无法访问您的 PDF 文件,就无法说出为什么您不能"grep"查找您正在寻找的字符串!

相关内容

  • 没有找到相关文章

最新更新