Краткий ответ: Вы можете получить отдельные токены текста с помощью Doc.GetText("SVG")
, проанализировав XML для элементов TEXT
и TSPAN
и определив, есть ли интервал макета, который следует рассматривать как фактическийпространства.Поведение, которое вы видите в PDFBox, вероятно, является их попыткой сделать такое предположение.Кроме того, даже Adobe Acrobat может возвращать разделенный текст через буфер обмена, как это делает PDFBox.
Длинный ответ: Это может вызвать больше проблем, поскольку это может не соответствовать первоначальному предназначению текста вPDF.
Здесь ABCpdf делает правильные вещи, так как спецификация PDF описывает только то, где вещи должны быть размещены в выходном носителе.Можно создать файл PDF, который ABCpdf интерпретирует в обоих стилях, даже если исходное предложение выглядит примерно одинаково.
Чтобы продемонстрировать это, приведен снимок документа Adobe InDesign, в котором показан текстовый макет, соответствующий обоимпадежи для вашего примера предложения.
![Snapshot From Adobe InDesign of a Specially Constructed PDF with Layout Spaces versus Text Spaces](https://i.stack.imgur.com/IHTrc.png)
Обратите внимание, что первая строка не была построена с фактическими пробелами, вместо этого слова были помещены вручную в отдельные области текста и выстроены в линию для просмотрапримерно как правильно расположенное предложение.Во второй строке есть одно предложение, которое содержит фактические текстовые пробелы между словами в одной текстовой области.
При экспорте в 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: пространство и атрибуты удалены, пробельные модификации для примера)
<?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>