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

时间:2011-10-19 19:34:09

标签: abcpdf

我正在使用ABCpdf提取某些PDF文件的文本内容,特别是通过调用Doc.GetText(“Text”)。 (你可以在一个循环中调用它,每页一次。)这通常很有效,但是对于某些PDF文件,生成的文本包含缺少空格字符的文本,例如。

  

Thissentencedoesn'thaveanyspacesbetweenwords。

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

  

这句话在单词之间没有任何空格。

总的来说,这两个工具就像他们害怕犯下不同的错误一样 - ABCpdf就像世界上最糟糕的事情就是插入一个不属于自己的空间,而Tika就像是最糟糕的事情。世界将无法插入一个人所属的空间。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

为了演示这一点,下面是Adobe 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:删除了空格和属性,为了示例,修改了空格)

<?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>

答案 1 :(得分:0)

此问题和答案基于ABCpdf的旧版本。

ABCpdf版本9将自动为您完成此操作。

我在ABCpdf .NET软件组件上工作,所以我的回复可能包含基于ABCpdf的概念。这就是我所知道的。 : - )