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