如何使用pdflib删除pdf中的字符

本文关键字:字符 pdf 删除 何使用 pdflib | 更新日期: 2023-09-27 18:01:03

我想使用PDF库删除PDF中的隐藏空间。

当我在PDF中提取一个单词"Gregor"时,它会显示为"Gre-gor",但我真的希望它像"Gregor"一样。

这可能是什么原因?或者,我该如何避免那些"隐藏空间"?

如何使用pdflib删除pdf中的字符

许多年前,我在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

这意味着,将颜色设置为红色(255 0 0(,移动到(72,72(,将一条线连接到(144,72(等,最后填充路径。这将创建一个红色正方形,每侧一英寸,左下角位于页面底部右侧1英寸处。

现在,当你处理文本时,它会稍微复杂一些。有四个运算符来绘制文本,Tj、'和Tj。它们在应用运算符之前或之后对文本放置的影响方面大多不同。尽管如此,在一个正常的世界里,你会期望你的文档在内容流中有这样的内容:

BT 72 288 Td (Gregor) Tj ET

这意味着开始文本,将文本位置移动到(72288(,放置文本"Gregor",然后结束文本。

很可能情况并非如此。相反,您的文档可能看起来更像这样:

BT 72 288 Td (Gre) Tj --stuff-- 88 288 Td (gor) Tj ET

其中,stuff是零个或多个其他PDF运算符。PDF是一种页面描述语言,而不是文本文件格式。因此,PDF并没有规定您应该如何布局创建页面的内容流。事实上,有无数种方法可以生成等效/相同的页面。

因此,任何声称从PDF文档中提取文本的代码块的作者都应该花一些时间来非常清楚地回答"单词是什么?"这个问题,如果首先没有得到很好的回答,那么你就永远不会有任何合理的文本提取。虽然我不知道具体情况,但我高度怀疑pdflix对单词的定义是"文本放置运算符中的任何空格分隔的子字符串"。这个定义可能会让你达到80%的效果。也许更多,但不多。这是一个几乎微不足道的定义,但如果不使用单个文本放置操作符来放置单词,它将失败。见鬼,甚至还有PDF页面的文本没有按照阅读顺序排列。例如,troff(至少过去是这样(先布局所有的纯文本,然后是斜体文本,再是粗体文本。

然后你必须用不同的方式来思考这个问题。如果你将一个单词定义为一个有序的字形序列,这些字形在物理空间中彼此接近,大小相似,会怎么样?然后你会发现,这个定义将完全包含以前定义的成功案例,也正确地包含了以前"什么是一个词"定义中固有的大量以前的失败。您还发现,在代码中实际实现该定义要困难得多。虽然第一个定义可以在大约一个小时内完成,但这个定义更像是几周或几个月的时间才能真正正确,因为你必须回答"什么是接近的?"answers"什么是大小相似的?",沿着曲线排列的文本(当Acrobat能够在地图中找到单词时,我无法告诉你我有多高兴(。

因此,你应该从中得出的结论是,从PDF中提取文本是不平凡的,你应该预料到从平凡的代码中会有大量的失败。

逐行阅读pdf,并将"Gre-gor"替换为"Gregor"。

我强烈建议您查看PdfTextStream。他们完成了底座帖子中描述的艰苦工作。

http://www.snowtide.com/

他们的目标是对一个词做出最自然的定义(人类读者期望一个词是什么(。