Могу ли я запретить ABCpdf смешивать слова (например, mashingwordstogether) при преобразовании PDF в текст? - PullRequest
5 голосов
/ 19 октября 2011

Я использую ABCpdf для извлечения текстового содержимого некоторых файлов PDF, в частности, вызывая Doc.GetText («Текст»).(Вы называете это в цикле, один раз на страницу.) Это обычно работает хорошо, но для некоторых файлов PDF результирующий текст состоит из текста с недостатком пробелов, например

Thissentencedoes nothaveanyspacesbetweenwords.

Что интересно, если я пытаюсь извлечь текст из тех же самых PDF-файлов, используя Apache Tika (работает под капотом от PDFBox), я получаю все пробелы между словами.То есть вышеприведенное предложение будет отображаться Тикой как

. В этом предложении нет пробелов между словами.

В целом, два инструмента действуют так, как будто они 'боятся совершать разные ошибки - ABCpdf ведет себя как худшая вещь в мире - вставлять пробел, к которому он не принадлежит, в то время как Тика ведет себя как худшая вещь в мире - не вставлять пробел, гдепринадлежит.

Существуют ли какие-либо настройки, чтобы ABCpdf действовал в этом отношении как Тика?

Ответы [ 2 ]

4 голосов
/ 04 ноября 2011

Краткий ответ: Вы можете получить отдельные токены текста с помощью 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

Обратите внимание, что первая строка не была построена с фактическими пробелами, вместо этого слова были помещены вручную в отдельные области текста и выстроены в линию для просмотрапримерно как правильно расположенное предложение.Во второй строке есть одно предложение, которое содержит фактические текстовые пробелы между словами в одной текстовой области.

При экспорте в 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>
0 голосов
/ 03 июня 2013

Этот вопрос и ответ основаны на старых выпусках ABCpdf.

ABCpdf версии 9 сделает все это автоматически для вас.

Я работаю над программным компонентом ABCpdf .NET, поэтому в моих ответах могут быть концепции, основанные на ABCpdf. Это только то, что я знаю. : -)

...