Чтение PDF с использованием itextsharp, где язык PDF не является английским

Я пытаюсь прочитать этот PDF, используя itextsharp в C #, который преобразует этот pdf в файл слова. также необходимо поддерживать формирование таблиц и шрифтов в слове, когда я пытаюсь использовать английский pdf, он будет работать отлично, но с использованием некоторых индийских языков, таких как хинди, маратхи, он не работает.

public string ReadPdfFile(string Filename) { string strText = string.Empty; StringBuilder text = new StringBuilder(); try { PdfReader reader = new PdfReader((string)Filename); if (File.Exists(Filename)) { PdfReader pdfReader = new PdfReader(Filename); for (int page = 1; page <= pdfReader.NumberOfPages; page++) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy); text.Append(currentText); pdfReader.Close(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } textBox1.Text = text.ToString(); return text.ToString(); ; } 

Я проверил ваш файл с особым упором на ваш образец «मतद | र», который извлекается как «मतदरर» в самой верхней строке страниц документа.

В двух словах:

Сам документ предоставляет информацию, например, глифы «मतद | र» в строке заголовка представляют текст «मतदरर». Вы должны спросить источник своего документа для версии документа, в которой информация о шрифтах не вводит в заблуждение. Если это невозможно, вы должны пойти на OCR.

В деталях:

Верхняя строка первой страницы генерируется следующими операциями в streamе содержимого страницы:

 /9 280 Tf (-12"!%$"234%56*5) Tj 

Первая строка выбирает шрифт с именем / 9 размером 280 (операция в начале страницы масштабирует все в 0,05 раза, таким образом, эффективный размер – 14 единиц, которые вы наблюдаете в файле).

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

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

Шрифт / 9 на первой странице вашего PDF определяется с помощью этих объектов:

 242 0 obj<< /Type/Font/Name/9/BaseFont 243 0 R/FirstChar 33/LastChar 94 /Subtype/TrueType/ToUnicode 244 0 R/FontDescriptor 247 0 R/Widths 248 0 R>> endobj 243 0 obj/CDAC-GISTSurekh-Bold+0 endobj 247 0 obj<< /Type/FontDescriptor/FontFile2 245 0 R/FontBBox 246 0 R/FontName 243 0 R /Flags 4/MissingWidth 946/StemV 0/StemH 0/CapHeight 500/XHeight 0 /Ascent 1050/Descent -400/Leading 0/MaxWidth 1892/AvgWidth 946/ItalicAngle 0>> endobj 

Таким образом, нет элемента / Encoding, но по крайней мере есть ссылка на карту / ToUnicode . Таким образом, программа, извлекающая текст, должна полагаться на данное отображение / ToUnicode .

Поток, на который ссылается / ToUnicode, содержит следующие отображения, представляющие интерес, при извлечении текста из (-12 “!% $” 234% 56 * 5):

 <21> <21> <0930> <22> <22> <0930> <24> <24> <091c> <25> <25> <0020> <2a> <2a> <0031> <2d> <2d> <092e> <31> <31> <0924> <32> <32> <0926> <33> <33> <0926> <34> <34> <002c> <35> <35> <0032> <36> <36> <0030> 

(Уже здесь вы можете видеть, что несколько кодов символов сопоставлены с одной и той же кодовой точкой юникода …)

Таким образом, извлечение текста должно приводить к:

 - = 0x2d -> 0x092e = म 1 = 0x31 -> 0x0924 = त 2 = 0x32 -> 0x0926 = द " = 0x22 -> 0x0930 = र instead of | ! = 0x21 -> 0x0930 = र % = 0x25 -> 0x0020 = $ = 0x24 -> 0x091c = ज " = 0x22 -> 0x0930 = र 2 = 0x32 -> 0x0926 = द 3 = 0x33 -> 0x0926 = द 4 = 0x34 -> 0x002c = , % = 0x25 -> 0x0020 = 5 = 0x35 -> 0x0032 = 2 6 = 0x36 -> 0x0030 = 0 * = 0x2a -> 0x0031 = 1 5 = 0x35 -> 0x0032 = 2 

Таким образом, текст iTextSharp (а также Adobe Reader!) Извлекает из заголовка на первой странице документа именно то, что документ в его заявках на шрифты является правильным.

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

Как сказал @mkl, нам потребуется дополнительная информация о том, почему все не работает. Но я могу сказать вам пару вещей, которые могут вам помочь.

Во-первых, SimpleTextExtractionStrategy очень прост . Если вы прочтете документы для него, вы увидите следующее:

Если PDF-файл создает текст не сверху вниз, это приведет к тому, что текст не будет истинным представлением о том, как он отображается в PDF-файле

Это означает, что, хотя PDF может выглядеть так, что его следует читать сверху донизу, он может быть написан в другом порядке. На самом деле PDF, на который вы ссылаетесь, имеет вторую визуальную линию, написанную первым. См. Мой пост здесь для немного более умной страtagsи извлечения текста, которая пытается вернуть текст сверху вниз. Когда я запускаю свой код на первой странице вашего PDF-файла, он, как представляется, вытаскивает каждую «строку» правильно.

Во-вторых, в PDF-файлах нет концепции таблиц. У них просто текст и линии, нарисованные в определенных местах, и ни одна из них не связана друг с другом. Это означает, что вам нужно будет рассчитать каждую строку и построить собственную концепцию таблицы, вы не найдете никакого кода в iTextSharp, который сделает это за вас. Я лично даже не стал бы писать.

В-третьих, извлечение текста предназначено для вытягивания текста, который не имеет ничего общего с шрифтами. Если вы хотите, вам придется строить эту логику в себе. См. Мой пост здесь для очень простого начала.

  • Как проверить, правильно ли обработан шрифт в pdf?
  • Как объединить два файла PDF в один на Java?
  • Чтение содержимого PDF с помощью itextsharp dll в VB.NET или C #
  • Сделать Chrome всегда открытым PDF-файлы
  • Сохранить как PDF в Microsoft Word 2007 не встраивает шрифты
  • Отключить кнопку сохранения в Adobe PDF Reader и скрыть панель меню в окне IE
  • Как сравнить различия между двумя файлами PDF в Windows?
  • Получить шрифт каждой строки с помощью PDFBox
  • android: откройте pdf из моего приложения, используя встроенный просмотрщик PDF
  • Как извлечь изображение из файла PDF
  • Пакетный выпуск - создание папок и перемещение документов
  • Давайте будем гением компьютера.