如何用grep搜索我的PDF?

时间:2015-01-13 16:48:03

标签: pdf grep pdftotext

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

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

如果您真的可以从PDF中获取给定字符串(您可以在渲染或打印的PDF页面上'看到并读取),即使在pdftotext的帮助下,那你一定很幸运。

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

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

有许多类型的PDF,其中pdftotext根本无法提取文本。原因可能是(以下列表未完成):

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

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

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

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

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


  4. 您可以使用名为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地图) 对于每种字体noencoding列不包含custom,但是builtin(意味着字形文件提供了字形>字符映射,属于Type 1

    总结一下: 无法访问您的PDF文件,无法告诉您为什么不能“grep”找到您要查找的字符串!