我想使用 PDF lib 删除 PDF 中的隐藏空间。
当我在 PDF 中提取单词“Gregor”时,它会显示为“Gre gor”,但我真的想要它像“Gregor”。
这可能是什么原因?或者,我怎样才能避免那些“隐藏空间”?
许多年前,我在 Adobe 工作过 Acrobat 1.0 版及更高版本。当时,我编写了用于搜索、突出显示和复制粘贴的工具。我将尝试解释为什么您可能会看到您所看到的以及为什么您可能也是 SOL(除非您想破解 PDF lib)。
在 PDF 中,页面内容由类似于 PostScript 的 RPN 语言的程序表示。它的不同之处在于它不是图灵完备的。它缺少循环、合理的函数定义、递归等——因此回避了令人讨厌的停止问题。典型的页面内容程序如下所示:
255 0 0 sc 72 72 m 144 72 l 144 144 l 72 144 l f
这意味着,将颜色设置为红色 (255 0 0),移动到 (72, 72),将一条线连接到 (144, 72) 等,最后填充路径。这将创建一个红色正方形,边长一英寸,左下角位于页面底部右侧上方 1 英寸处。
现在,当您使用文本时,它会稍微复杂一些。有四个操作符来绘制文本,Tj、'、" 和 TJ。它们在应用操作符之前或之后影响文本放置的方式主要不同。尽管如此,在一个理智的世界里,你会期望你的文档有一些东西像这样在内容流中:
BT 72 288 Td (Gregor) Tj ET
这意味着开始文本,将文本位置移动到 (72, 288),放置文本“Gregor”,然后结束文本。
很可能,情况并非如此。相反,您的文档可能看起来更像这样:
BT 72 288 Td (Gre) Tj --stuff-- 88 288 Td (gor) Tj ET
其中 --stuff-- 是零个或多个其他 PDF 运算符。PDF 是一种页面描述语言,而不是文本文件格式。因此,PDF 没有规定您应该如何布置内容流以创建页面。事实上,有无数种方法可以生成等效/相同的页面。
因此,任何声称从 PDF 文档中提取文本的代码块的作者都应该花一些时间来非常清楚地回答这个问题,“什么是单词?” 如果首先没有很好地回答这个问题,那么您将永远无法进行任何合理的文本提取。虽然我不知道具体,但我高度怀疑 pdflib 对单词的定义是“来自文本放置运算符的任何空格分隔的子字符串”。这个定义可能会让你走上 80% 的路。也许更多,但不多。这是一个几乎微不足道的定义,但如果没有使用单个文本放置操作符放置单词,它将失败。哎呀,甚至有一些 PDF 页面的文本没有放在接近阅读顺序的任何地方。例如,troff(至少习惯于)首先布局所有纯文本,
然后你必须以不同的方式思考这个问题。如果您将一个单词定义为在物理空间上彼此接近且大小相似的有序字形序列怎么办?然后您会发现该定义将完全包含先前定义的成功案例,并且还正确包含先前“什么是单词”定义中固有的大量先前失败。您还发现该定义在代码中的实际实现是显着的更加困难。虽然第一个定义可以在大约一个小时的时间内完成,但这个定义更像是几周或几个月的时间才能真正做到正确,因为你必须回答“什么是接近的?”的问题。和“什么大小相似?” 当您使用它时,您需要考虑其他事情,例如文本编码、连字、任意连字符、沿曲线放置的文本(当 Acrobat 能够在地图中找到单词时,我无法告诉您我有多高兴)。
因此,您应该从中得出的结论是,从 PDF 中提取文本并非易事,并且您应该期望从琐碎的代码中会出现大量失败。
逐行阅读pdf并将“Gre gor”替换为“Gregor”。
我强烈建议您查看 PdfTextStream。他们已经完成了 plinth 帖子中描述的艰苦工作。
他们的目标是对一个词进行最自然的(人类读者期望的词)定义。