gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:40:50 41 4
gpt4 key购买 nike

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

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

这可能是什么原因?或者,我怎样才能避免那些“隐藏空间”?

最佳答案

很多年前,我在 Adob​​e 工作,负责 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 英寸,左下角位于页面底部右侧上方 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 能够在 map 中查找单词时我有多高兴)。

因此,您应该从中得出的结论是,从 PDF 中提取文本并非易事,您应该预料到从普通编写的代码中会出现大量失败。

关于c# - 如何使用 pdflib 删除 pdf 中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6580901/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com