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

2024-06-27

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

这句话的词与词之间没有任何空格。

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

这句话的词与词之间没有空格。

总的来说,这两个工具表现得好像它们害怕犯不同的错误——ABCpdf 的表现就像世界上最糟糕的事情就是在不属于的地方插入一个空格,而 Tika 的表现就像世界上最糟糕的事情是插入一个不属于的空格。未能在一个人所属的地方插入一个空格。

有没有什么设置可以让 ABCpdf 在这方面更像 Tika?


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

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

ABCpdf 在这里做的是正确的事情,因为 PDF 规范仅描述了内容应该放置在输出介质中的位置。人们可以构建一个 ABCpdf 以两种风格解释的 PDF 文件,即使原始句子看起来几乎相同。

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

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

当导出为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:删除空格和属性,为了示例而修改空格)

<?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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 PDF 转换为文本时,我可以阻止 ABCpdf 将单词混合在一起(例如 mashingwordstogether)吗? 的相关文章

  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra
  • 如何在一个 .exe 文件中构建并链接 Lua 核心和几个 Lua 模块

    我需要制作可在 Windows Linux MacOS 上运行且无需安装的便携式应用程序 它必须是一个可执行文件 并且不能有其他库文件 dll so 我将使用 ANSI C 并为每个平台重新编译项目 我想使用Lua脚本 所以必须在我的代码中
  • 未安装的应用程序的URL方案

    简单的问题 我正在开发一个将注册自己的 URL 方案的应用程序 我计划通过人们最喜欢的 QRCode 阅读器使用 QRCode 启动该应用程序 我的问题 如果我的应用程序尚未安装在他们的 iPhone iPad 上 会发生什么 他们会被引导
  • 无法在 SSIS 查找中选择 ODBC 源

    我正在创建一个用于更新 SQL Server 中的表的包 要更新的详细信息是从 MySQL 数据库获取的 为此 我使用 ODBC 连接管理器连接到 MySQL 但此 ODBC 连接管理器未在 OLE DB 连接管理器中列出 我可以在 Too

随机推荐