2017-02-06 6 views
0

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

https://www.treasury.gov/ofac/downloads/sdnlist.pdf

Это код:

var currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 2, new SimpleTextExtractionStrategy()); 
        if (currentText.Length > 0) 
          { 
           var capture = new Capture(); 
           capture.Text = currentText; 

           // write the results to the DB, if any data was found 
           _dataService.AddCapture(capture); 
          } 

Использование SimpleTextExtractionStrategy, результаты записываются в базу данных с мириадами нежелательных пробелов внутри слов. Первые несколько строк на странице 2 записи, как:

ОФИСА контроля иностранных активов СПЕЦИАЛЬНО Гражданин & ЗАБЛОКИРОВАН ЛИЦА 3 февраля 2017 года - 2 - зенитные RASPLET IN; a .k. a. AL MAZ -AN TEY MSDB; a .k.a. AL MAZ -ANTEY PV O 'AI R DEFENSE' CO NCERN LEAD SYSTE M S КОНСТРУКТОРСКОЕ БЮРО ОАО 'OPEN JO INT -STOCK КОМПАНИЯ' IMENI ACADEMIC IAN A.A. Расплетина; a.k .a. GO LOVNOYE SISTEMN OYE KONS TRUKT ORSKOY E BYURO OPEN J OIN T-S TOCK C OMP ANY OF ALMAZ -AN TEY PVO C ONCERN I MEN I ACADEMICIAN A .A. РАСПРОСТРАНЕНИЕ; a.k. а. JO INT STOCK C OMPANY A LMA Z-AN TEY AI R DEFENSE CON CERN MA IN SYSTE M КОНСТРУКТОРСКОЕ БЮРО ИМЕНИ АКАДЕ МИКИАНА А.А.

См, например, слово «JO INT» в 4-й & 6-й линии, а слово «CON CERN» в 2-го по последней строке. Эти типы пространств встречаются во всех результатах. К сожалению, запрос к тексту невозможен.

Кто-нибудь есть идеи, почему это делает это и как это разрешить?

ответ

1

почему это делает это

Причина на самом деле является особенностью стратегии извлечения текста, который в вашем случае не работает, как требуется.

Немного предыстории: То, что вы воспринимаете как пространство между словами в файле формата PDF не обязательно приходят в бытие из-за инструкцией рисования пробел, он может также быть результатом инструкции сдвигая положение ввода текста немного вправо. Таким образом, стратегии выделения текста обычно добавляют пространственный символ при нахождении достаточно большого правого сдвига. Еще немного об этом (в частности, о «достаточно большой» части), например, this answer.

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

, как решить эту проблему

Как слово разделений в вашем PDF создаются командами рисования пробел, вам не нужно было объяснено выше особенность. Таким образом, самый простой способ решить проблему - использовать стратегию извлечения текста без этой функции.

Вы можете создать такую ​​стратегию, скопировав исходный код SimpleTextExtractionStrategy (например,от here) и закомментировать несколько строк из метода RenderText, как показано ниже:

public virtual void RenderText(TextRenderInfo renderInfo) 
{ 
    [...] 

    if (hardReturn) 
    { 
     //System.out.Println("<< Hard Return >>"); 
     AppendTextChunk('\n'); 
    } 
    else if (!firstRender) 
    { 
//  if (result[result.Length - 1] != ' ' && renderInfo.GetText().Length > 0 && renderInfo.GetText()[0] != ' ') 
//  { // we only insert a blank space if the trailing character of the previous string wasn't a space, and the leading character of the current string isn't a space 
//   float spacing = lastEnd.Subtract(start).Length; 
//   if (spacing > renderInfo.GetSingleSpaceWidth()/2f) 
//   { 
//    AppendTextChunk(' '); 
//    //System.out.Println("Inserting implied space before '" + renderInfo.GetText() + "'"); 
//   } 
//  } 
    } 
    else 
    { 
     //System.out.Println("Displaying first string of content '" + text + "' :: x1 = " + x1); 
    } 

    [...] 
} 

Используя эту упрощенную стратегию извлечения, текст правильно извлечен.

+0

Я видел вас вокруг этих частей, и вы, безусловно, являетесь Королем этого предмета. Спасибо за вашу великую мудрость и помощь! – Stpete111

Смежные вопросы