Читать PDF последовательно слева направо, а не на основе координат - PullRequest
0 голосов
/ 31 января 2019

Я использую iTextSharp для извлечения текста из PDF.Проблема в том, что если у вас есть таблицы или структура формы на странице, то извлеченный текст становится неструктурированным, что не имеет никакого смысла.Пример PDF-страницы выглядит следующим образом:

Sample Tax Form

Извлеченный текст из iTextSharp показан ниже

700061
04-01-17
Prepared for: Prepared by:
Filing Instructions

    JACK & JILL  ANDERSON                 WATSON ASSOC
    1234 MAIN STREET                      BENNINGTON STREET
    NEWPORT BEACH, CA  92660              STANFORD, NJ  700049

    2017 U.S. INDIVIDUAL INCOME TAX RETURN

      YOU HAVE A BALANCE DUE OF..........................$         8141

      THIS RETURN HAS BEEN PREPARED FOR ELECTRONIC FILING AND THE PRACTITIONER 
      PIN PROGRAM HAS BEEN ELECTED.  PLEASE SIGN AND RETURN FORM 8879 TO OUR 
      OFFICE.  WE WILL THEN TRANSMIT YOUR RETURN ELECTRONICALLY TO THE IRS.  DO
      NOT MAIL THE PAPER COPY OF THE RETURN TO THE IRS.  RETURN FEDERAL FORM 
      8879 TO US BY APRIL 17, 2018.
    2018 U.S. ESTIMATED INDIVIDUAL INCOME TAX

      ESTIMATED TAX VOUCHERS ARE DUE AS FOLLOWS:
      $      3000  DUE BY  APRIL 17, 2018
      $      2926  DUE BY  JUNE 15, 2018
      $      2852  DUE BY  SEPTEMBER 17, 2018
      $      2426  DUE BY  JANUARY 15, 2019

      INCLUDE YOUR SSN AND THE WORDS "2018 FORM 1040-ES" ON YOUR CHECK.

      MAIL ON OR BEFORE THE DUE DATE TO: INTERNAL REVENUE SERVICE CENTER
                                         P.O. BOX 510000
                                         SAN FRANCISCO, CA  94151-5100







    FORM 1040-V

      PAYMENT SHOULD BE SUBMITTED WITH FORM 1040-V.  INCLUDE YOUR SSN, PHONE 
      NUMBER AND THE WORDS "2017 FORM 1040" ON YOUR CHECK.  MAKE CHECK FOR 
      $8141 PAYABLE TO UNITED STATES TREASURY.

      MAIL BY APRIL 17, 2018 TO:     INTERNAL REVENUE SERVICE CENTER
                                     P.O. BOX 7704
                                     SAN FRANCISCO, CA  94120-7704

.заключается в том, что первая строка не является «Инструкцией подачи», а в следующей строке после текста «Подготовлено для:» мы будем читать «ДЖЕК И ДЖИЛЛ АНДЕРСОН», а не «Подготовлено:».Также, когда мы смотрим на PDF, мы будем читать «1234 MAIN STREET» после «JACK & JILL ANDERSON», но в извлеченном тексте это «WATSON ASSOC».

Есть ли способ извлечь текст так, как мы читали бы документ PDF.

Код для извлечения текста:

PdfReader pdfReader = new PdfReader(fileName);
PdfDocument doc = new PdfDocument(pdfReader);
for (int pageNo = 1; pageNo <= doc.GetNumberOfPages(); pageNo++)
{
    PdfPage page = doc.GetPage(pageNo);
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    string currentText = PdfTextExtractor.GetTextFromPage(page, strategy);
}

1 Ответ

0 голосов
/ 01 февраля 2019

короткий ответ:

Да (вероятно) есть

длинный ответ:

PDF не похож надокумент Word или страница HTML.Документы PDF могут содержать структурную информацию (указывающую, какие глифы составляют строку текста, какие строки составляют абзац и т. Д.).Но спецификация не обязывает их делать это.

Большинство документов PDF, которые вы найдете в дикой природе, на самом деле не содержат структурную информацию.

iText (и многие другие библиотеки)использовать простую эвристику.Они анализируют инструкции рендеринга, сохраняют их и сортируют в «логическом порядке чтения».То есть сверху вниз, слева направо.

Конечно, в документах, подобных этому, эффект довольно слабый.

iText действительно позволяет вам выбрать эвристику, которую вы хотитеиспользовать.Если ничего не указано, вы используете SimpleTextExtractionStrategy, который выплевывает глифы в порядке появления в потоке команд (который может не совпадать с порядком чтения).

Как сказал @mkl, однако, некаждый обязан читать документ одинаково.Это становится еще более интересным (и сложным), если вы думаете о научных статьях (сноски, встроенная графика, встроенные таблицы и т. Д.) Или журнальных статьях (встроенные цитаты или фрагменты).

Я думаю, вам будет лучшепробовать инструмент типа pdf2Data, который является частью семейства iText.Он считывает входной документ, сопоставляет его с шаблоном, а затем выплевывает информацию либо в виде JSON-подобной структуры данных, либо в виде HTML.

Таким образом, вы можете сопоставить этот документ с шаблоном, исначала решите, какую информацию вы хотите извлечь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...