gpt4 book ai didi

abcpdf - 将 PDF 转换为文本时,我可以防止 ABCpdf 将单词混搭在一起(例如 mashingwordstogether)吗?

转载 作者:行者123 更新时间:2023-12-03 16:04:57 26 4
gpt4 key购买 nike

我正在使用 ABCpdf 来提取一些 PDF 文件的文本内容,特别是通过调用 Doc.GetText("Text")。 (您循环调用它,每页一次。)这通常效果很好,但对于某些 PDF 文件,生成的文本由缺少空格字符的文本组成,例如

Thissentencedoesn'thaveanyspacesbetweenwords.



有趣的是,如果我尝试使用 Apache Tika(由 PDFBox 在幕后提供支持)从完全相同的 PDF 中提取文本,我往往会得到我期望的单词之间的所有空格。也就是说,上面的句子将由 Tika 呈现为

This sentence doesn't have any spaces between words.



总的来说,这两个工具表现得好像他们害怕犯不同的错误——ABCpdf 表现得好像世界上最糟糕的事情是插入一个不属于的空间,而 Tika 表现得像世界上最糟糕的事情不能插入一个属于自己的空间。

在这方面,是否有任何设置可以使 ABCpdf 更像 Tika?

最佳答案

简答:您可以通过 Doc.GetText("SVG") 获取文本的单个标记,解析 TEXT 的 XML和 TSPAN元素,并确定是否存在应视为实际空间的布局间距。您从 PDFBox 看到的行为可能是他们试图做出这种假设。此外,即使是 Adob​​e Acrobat 也可以像 PDFBox 一样通过剪贴板返回间隔文本。

长答案:这可能会导致更多问题,因为这可能不是 PDF 中文本的原始意图。

ABCpdf 在这里做的是正确的事情,因为 PDF 规范只描述了东西应该放在输出媒体的什么地方。可以构建一个 ABCpdf 以两种风格解释的 PDF 文件,即使原始句子看起来几乎相同。

为了证明这一点,以下是来自 Adob​​e InDesign 的文档快照,其中显示了与示例句子的两种情况相匹配的文本布局。

Snapshot From Adobe InDesign of a Specially Constructed PDF with Layout Spaces versus Text Spaces

请注意,第一行不是用实际空格构建的,而是手动将单词放置在单独的文本区域中,并排成一行,看起来大致像一个间隔适当的句子。第二行有一个句子,在单个文本区域中,单词之间有实际的文本空间。

当导出为 PDF,然后由 ABCpdf 读入时,Doc.GetText("TEXT")将返回以下内容:

ThisSentenceDoesn'tHaveAnySpacesBetweenWords.  
This Sentence Doesn't Have Any Spaces Between Words.

因此,如果您希望检测布局空间,则必须使用 SVG 输出并手动遍历文本标记。 Doc.GetText("SVG")返回文本和其他绘图实体,因为 ABCpdf 在页面上看到它们,您可以决定如何处理基于布局的间距的情况。

您将收到类似于以下内容的输出:
<?xml version="1.0" standalone="no"?>
<svg width="612" height="792" x="0" y="0" version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<text xml:space="preserve" x="36" y="46.1924" font-size="14" font-family="ArialMT" textLength="26.446" transform="translate(36, 46.1924) translate(-36, -46.1924)">This</text>
<text xml:space="preserve" x="66.002" y="46.1924" font-size="14" font-family="ArialMT" textLength="59.15" transform="translate(66.002, 46.1924) translate(-66.002, -46.1924)">Sentence</text>
<text xml:space="preserve" x="129.604" y="46.1924" font-size="14" font-family="ArialMT" textLength="47.46" transform="translate(129.604, 46.1924) translate(-129.604, -46.1924)">Doesn&#8217;t</text>
<text xml:space="preserve" x="181.208" y="46.1924" font-size="14" font-family="ArialMT" textLength="32.676" transform="translate(181.208, 46.1924) translate(-181.208, -46.1924)">Have</text>
<text xml:space="preserve" x="219.61" y="46.1924" font-size="14" font-family="ArialMT" textLength="24.122" transform="translate(219.61, 46.1924) translate(-219.61, -46.1924)">Any</text>
<text xml:space="preserve" x="249.612" y="46.1924" font-size="14" font-family="ArialMT" textLength="46.69" transform="translate(249.612, 46.1924) translate(-249.612, -46.1924)">Spaces</text>
<text xml:space="preserve" x="301.216" y="46.1924" font-size="14" font-family="ArialMT" textLength="54.474" transform="translate(301.216, 46.1924) translate(-301.216, -46.1924)">Between</text>
<text xml:space="preserve" x="360.016" y="46.1924" font-size="14" font-family="ArialMT" transform="translate(360.016, 46.1924) translate(-360.016, -46.1924)"><tspan textLength="13.216">W</tspan><tspan dx="-0.252" textLength="31.122">ords.</tspan></text>
<text xml:space="preserve" x="36.014" y="141.9944" font-size="14" font-family="ArialMT" transform="translate(36.014, 141.9944) translate(-36.014, -141.9944)">
<tspan textLength="181.3">This Sentence Doesn&#8217;t Have </tspan><tspan dx="-0.756" textLength="150.178">Any Spaces Between W</tspan><tspan dx="-0.252" textLength="31.122">ords.</tspan></text>
</svg>

请注意,基本结构揭示了给您带来问题的原始意图。 (xml:space 和属性被删除,为了示例而修改空格)
<?xml version="1.0" standalone="no"?>
<svg>
<text>This</text>
<text>Sentence</text>
<text>Doesn&#8217;t</text>
<text>Have</text>
<text>Any</text>
<text>Spaces</text>
<text>Between</text>
<text><tspan>W</tspan><tspan>ords.</tspan></text>
<text>
<tspan>This Sentence Doesn&#8217;t Have </tspan>
<tspan>Any Spaces Between W</tspan>
<tspan>ords.</tspan>
</text>
</svg>

关于abcpdf - 将 PDF 转换为文本时,我可以防止 ABCpdf 将单词混搭在一起(例如 mashingwordstogether)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827051/

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