Мы получаем большой объем данных от наших клиентов в файлах pdf в различных форматах [с точки зрения макета], эти файлы обычно представляют собой выходные данные отчета и, как правило, должным образом аннотированы [им обычно не требуется OCR], но недостаточно хорошо отформатированы, чтобы просто скопировать несколько сотен страниц текста из acrobat не получится.
Наилучший подход, который я нашел до сих пор, - это написать сценарий для анализа почти действительного вывода xml (комментарии недействительны, и многие символы экранированы различными способами, é становится [[[e9]]] é, $ становится \ $,% становится \% ...) утилиты командной строки pdftoipe (для преобразования файлов PDF для программы под названием ипе), которая дает мне текстовые элементы с их позициями на каждой странице [см. пример ниже], которая работает достаточно хорошо для отчетов, в которых одни и те же значения находятся в одном и том же месте на каждой интересующей меня странице, но для импорта файлов PDF с матрицами [кросс-таблицей] потребуются дополнительные усилия по написанию сценариев. pdftoipe совсем не предназначен для этого, и в лучшем случае его можно скомпилировать вручную с помощью cygwin для Windows.
Существуют ли библиотеки, которые упрощают эту задачу на каком-нибудь языке сценариев, который я терпеть не могу? Графический инструмент тоже был бы отличным. И пони.
pdftoipe вывод этот образец выглядит так:
<ipe creator = "pdftoipe 2006/10/09"><info media = "0 0 612 792"/>
<-- Page: 1 1 -->
<page gridsize = "8">
<path fill = "1 1 1" fillrule = "wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill = "1 1 1" fillrule = "wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill = "1 1 1" fillrule = "wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<text stroke = "1 0 0" pos = "0 0" size = "18" transformable = "yes" matrix = "1 0 0 1 181.8 707.88">This is a sample PDF fil</text>
<text stroke = "1 0 0" pos = "0 0" size = "18" transformable = "yes" matrix = "1 0 0 1 356.28 707.88">e.</text>
<text stroke = "1 0 0" pos = "0 0" size = "18" transformable = "yes" matrix = "1 0 0 1 368.76 707.88"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 692.4"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 677.88"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 663.36"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 648.84"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 634.32"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 619.8"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 605.28"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 590.76"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 576.24"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 561.72"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 547.2"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 532.68"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 518.16"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 503.64"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 489.12"> </text>
<text stroke = "0 0 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 67.32 474.6"> </text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 67.32 456.24">If you can read this</text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 214.92 456.24">,</text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 219.48 456.24"> you already have A</text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 370.8 456.24">dobe Acrobat </text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 67.32 437.64">Reader i</text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 131.28 437.64">n</text>
<text stroke = "0 0 1" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 141.12 437.64">stalled on your computer.</text>
<text stroke = "0 0 0" pos = "0 0" size = "16.2" transformable = "yes" matrix = "1 0 0 1 337.92 437.64"> </text>
<text stroke = "0 0.502 0" pos = "0 0" size = "12.6" transformable = "yes" matrix = "1 0 0 1 342.48 437.64"> </text>
<image width = "800" height = "600" rect = "-92.04 800.64 374.4 449.76" ColorSpace = "DeviceRGB" BitsPerComponent = "8" Filter = "DCTDecode" length = "369925">
feedcafebabe...
</image>
</page>
</ipe>


Вы смотрели на Aspose? Мы используем его для приложения ASP.net, и я видел несколько примеров его использования в vbscript. Это тоже не особо дорого.
Мы используем Xpdf в одном из наших приложений. Это библиотека C++, которая в основном используется для рендеринга pdf, хотя в ней есть экстрактор текста, который может быть полезен для этого проекта.
pdftoipe основан на коде Xpdf. К сожалению, это лучший ответ на данный момент: самостоятельно модифицировать Xpdf в соответствии со своими потребностями.
Если вы не против вызвать что-то внешнее, вы можете использовать Призрачный сценарий - посмотрите скрипт ps2ascii, включенный в дистрибутив. Я не уверен, что вы хотите от графического инструмента - большой кнопки, которую вы нажимаете, чтобы выбрать файлы ввода и вывода? Предварительный просмотр? Вы можете использовать GSView, в зависимости от того, что хотите.
pdftohtml -xml
хотя pdftoipe кажется более подробным !!
Я не верю, что это то, что я ищу. Aspose.Pdf.Kit, похоже, только выводится. Можете быть более конкретными?