Попытка прочитать данные ascii из простого файла PDF в С#.NET 8 с помощью iText7
StringBuilder processed = new StringBuilder();
for (int i = 1; i <= pdfDocument.GetNumberOfPages(); ++i)
{
var page = pdfDocument.GetPage(i);
string text = PdfTextExtractor.GetTextFromPage(page, strategy);
processed.Append(text);
}
возвращает искаженный текст
����������\n��������������������������\n
Текст можно скопировать из PDF в программе просмотра Adobe Acrobat PDF.
PDF находится в
https://wetransfer.com/downloads/e21c2093f9a732287383fc5ca97104cd20240414124039/b3ad1e
Как прочитать текст из этого PDF-файла? Можно ли настроить iText или использовать какую-либо другую библиотеку для чтения PDF-файлов?
Об этом уже спрашивали
Чтение текста из pdf с помощью iText7 + C#, текст не распознается
но не решено.
PDF-файл имеет неверную таблицу шрифтов и дополнительную проблему смещения текста (перекрытия).
Есть два способа справиться с таким файлом (он хорошо выглядит в Acrobat), но в других приложениях он ведет себя неправильно, и оба перепечатываются.
Я попробовал несколько способов и пришел к выводу, что Acrobat Print в GhostScript Postscript лучше всего подходит, поскольку PDF в PDF просто переносит ошибки. Затем преобразуйте Postscript в GhostScript обратно в PDF.
Вы можете использовать старый метод командной строки: запустить Poppler/Xpdf PDFtoPS или GhostScript, преобразовать в PS, а затем GhostScript PS обратно в PDF. Но он все равно будет иметь смещенный текст.
Как только шрифты будут решены, вы можете попробовать еще раз с помощью iTeXt, или я просто запустил poppler PDFtoTeXT, чтобы удалить превышение. Ссылка на последнюю текущую 64-битную версию. Пользователям 32-разрядной версии Windows и другим пользователям может потребоваться инструменты командной строки Xpdf: на данный момент версия 4.05 ( https://www.xpdfreader.com/download.html). Так, например, с попплером и целевой страницей 1.
ПРИМЕЧАНИЕ. С этим конкретным файлом Poppler работал заметно лучше, чем Xpdf. Однако ваши результаты могут различаться в зависимости от языка, ввода, платформы и настроек!
pdftotext -layout -nopgbrk -enc UTF-8 -fixed 3.1 "in-fixed.pdf" "out.txt"
Результат
Tarnija: Rolling OÜ
Registrikood / KMKR nr.: 12571469 / EE101695107
Aadress: Betooni tn 1, Tallinn, 11415
Kaupade väljastamiskoht: Betooni tn 1, Tallinn, 11415
Panga nimetus: SEB PANK AS, EEUHEE2X
Arve: 2403793 EST 09.04.2024
Panga konto: EE131010220225504229
Kontaktinformatsioon: Telefon: 6 280 808; Faks: 6 280 809
Maksekuupäev: 09.05.2024 Teie kontaktisik: Angelina Burtseva
Vedaja: ROLLING OÜ Saaja: DGM SHIPPING, AS
Registreerimisnumber: 12571469
Sõiduki juhi eesnimi, perekonnanimi: Kliendi number 71771
Sõiduki registreerimisnumber: Registrikood / KMKR nr.: 10061617 / EE100412077
Tehingu kirjeldus: kaupade tarnimine Aadress: A. Puškini tn 9-6, Narva, 20309
Piirkond: NEW - EAST TALLINN Kaupade kättesaamiskoht: Nurmevälja tn 1 Maardu Harjumaa 74114
Panga nimetus:
Panga konto:
Makseviis: 30 days Maksja: DGM SHIPPING, AS
Kommentaar:
Kaubad on tarnija omand seni, kuni nende eest on täielikult tasutud
Kogus/ Hind Summa
Artikkel Nimetus %
Ühik ilma KM ilma KM
Saateleht 2405326 [STOCK] (EAST)
Nurmevälja tn 1 Maardu Harjumaa 74114
17-02-0206 Paberrätik Tork Basic M2, 280 m, 1 kiht, valge 6 rulli, 140002 1 IEPAK 30.05 4.1 28.82
17-26-0269 Tänavahari Saima Broom, 25 x 120 cm, must/punane 1 GAB 9.16 4.9 8.71
08-05-0005 Käärid Office Point, 15.5 cm, Soft-Grip 1 TÜKK 1.35 17.5 1.11
04-07-0238 Ilmastikukindlad kleebisetiketid Herma 99.1 x 93.1 mm, 25 lehte, valged, väga tugeva kinnitusega 1 IEPAK 30.85 15.7 26.01
17-01-0128 Tualettpaber Jumbo Clean, 12 rulli, 2 kihti, valge 1 IEPAK 23.80 4.5 22.73
Saateleht 2404987 [STOCK] (EAST),DMM, Viidud, 03.04.2024, 13:46
Nurmevälja tn 1 Maardu Harjumaa 74114
04-02-0225 Märkmepaber Forofis, 51x76mm,100p., kollane 3 GAB 0.46 20.4 1.10
...
continued down to
...
05-01-0010 Ümbrikud iseliimuva kleepribaga, C5, 25 tk. Valge 2 PK 1.37 17.0 2.27
05-01-0008 Ümbrikud iseliimuva kleepribaga, C6, 25 tk. Valge 4 PK 0.87 17.1 2.88
01-05-0197 Sissetõmmatav geelist tindipliiats ErichKrause Smart-Gel, 0,5 mm, tindi värv: sinine 12GAB 0.60 18.4 5.88
Обсуждение в комментариях показало, что желательны только небольшие части страниц 1 и 4, и это можно сделать непосредственно на источнике низкого качества с помощью poppler PDFtoText.
Например, чтобы извлечь строку из одного или двух слов или области, которую мы можем использовать,
pdftotext -f 1 -l 1 -layout -enc UTF-8 "rolling garbage Arve_24037931.pdf" - 2>nul |Findstr "Rolling EST KMKR Makseku" >temp.txt
Пока что это соответствует странице 1. Обратите внимание, что запрос не может включать акценты UTF, но результат может!
Tarnija: Rolling OÜ
Registrikood / KMKR nr.: 12571469 / EE101695107
Arve: 2403793 EST 09.04.2024
Maksekuupäev: 09.05.2024 Teie kontaktisik: Angelina Burtseva
Sõiduki registreerimisnumber: Registrikood / KMKR nr.: 10061617 / EE100412077
Аналогично мы можем добавить данные снизу страницы 4.
pdftotext -f 4 -l 4 -layout -enc UTF-8 "rolling garbage Arve_24037931.pdf" - 2>nul |Findstr "Summa 22% Kokku" >>temp.txt
Итак, теперь у нас есть основные данные.
Tarnija: Rolling OÜ
Registrikood / KMKR nr.: 12571469 / EE101695107
Arve: 2403793 EST 09.04.2024
Maksekuupäev: 09.05.2024 Teie kontaktisik: Angelina Burtseva
Sõiduki registreerimisnumber: Registrikood / KMKR nr.: 10061617 / EE100412077
Kogus/ Hind Summa
Summa ilma käibemaksutaEUR 370.37
*2403793r* 22%EUR 81.48
KokkuEUR 451.85
Текст извлекается в контроллере MVC, который ежедневно обрабатывает множество файлов PDF. Должен ли в этом случае Ghostscript выполняться два раза с контроллера, чтобы преобразовать его в ps, а затем ps обратно в pdf? PDF-файл открывается в iText. Может быть, можно исправить таблицу шрифтов, чтобы не требовался запуск Ghostscript? Из текста извлекаются только номер счета, имя клиента, общая сумма и НДС. Перекрывающийся текст находится в середине счета, и эта часть счета не используется для обработки. Или, может быть, есть какой-нибудь пакет .net, который можно использовать для исправления PDF, чтобы избежать запуска внешнего приложения на сервере?
Ошибка только в одном файле. Тот же клиент может отправить новый PDF-файл в будущем, и, вероятно, у него возникнет та же проблема. Мне нужны Arve: 2403793
, ROLLING OÜ
, 12571469
и даты с первой страницы, а сумма 370.37
и НДС 81.48
с последней страницы. Может быть, есть какое-то другое программное обеспечение, которое может извлечь текст из этого PDF-файла, как это делает Acrobat Copy, или этот текст может быть извлечен из ps или другого файла? Приложение ASP.NET работает в Windows и Linux. Было бы лучше избегать запуска внешних приложений с контроллера на сервере.
Попробовал pdftotext с xpdfreader.com/download.html. Оригинальный PDF-файл по-прежнему не открывается. Требуется ли Ghostscript для извлечения этого PDF-файла?
PDF — это не текст. Это собственный двоичный файл. Некоторые данные могут выглядеть как обычный текст, но текст окружают управляющие символы (двоичные символы).