简短回答:您可以通过 获取单个文本标记Doc.GetText("SVG")
,解析 XMLTEXT
和TSPAN
元素,并确定是否存在应视为实际空间的布局间距。您从 PDFBox 看到的行为可能是他们试图做出这种假设。此外,即使是 Adobe Acrobat 也可以像 PDFBox 一样通过剪贴板返回间隔文本。
长答案:这可能会导致更多问题,因为这可能不是 PDF 中文本的原始意图。
ABCpdf 在这里做的是正确的事情,因为 PDF 规范只描述了应该在输出介质中放置东西的位置。可以构建一个 ABCpdf 以两种样式解释的 PDF 文件,即使原始句子看起来几乎相同。
为了证明这一点,下面是来自 Adobe 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’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’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’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’t Have </tspan>
<tspan>Any Spaces Between W</tspan>
<tspan>ords.</tspan>
</text>
</svg>