PowerShell, itextsharp извлек текст, который больше не читается ( раньше скрипт был в порядке )

#powershell #character-encoding #itext

Вопрос:

Я использовал скрипт PowerShell с itextsharp для извлечения некоторых данных из PDF-файлов бухгалтерского учета для организации переименованных файлов ( с извлеченными данными ) в базе данных веб-сервера…

До недавнего времени все работало нормально :
Извлеченный текст больше не читается ; у меня есть такие символы, как

 !9H#SH!#!T !a!ST^ET
8%’?E!8A8A,A ;B;0D3FD
U .0’$=Q$;L?L$’($4-R$2’$4 (.’R.-./ ($D$
%M%G.T
 

Я предполагаю, что это как-то связано с новым способом кодирования после обновления программного обеспечения для бухгалтерского учета.
Работал простой скрипт, подобный приведенному ниже

 function convert-PDFtoText {
    param(
        [Parameter(Mandatory=$true)][string]$file
    )   
    Add-Type -Path "C:PathToitextsharp.dll"
    $pdf = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $file
    for ($page = 1; $page -le $pdf.NumberOfPages; $page  ){
        $text=[iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($pdf,$page)
        Write-Output $text
    }   
    $pdf.Close()
}

$file = "C:ADA3_FA20210274.pdf"

convert-PDFtoText $file
 

Это не работает с этими новыми файлами PDF.

Если бы кто-нибудь мог показать мне, как с этим справиться, я был бы благодарен
Я использую itextsharp 5.5.13.2
Редактировать:
Здесь ссылка на один из этих PDF :pdf_exemple.pdf

Комментарии:

1. Похоже, что PDF-файлы больше не являются текстовыми, а являются изображениями.. Вам следует связаться с поставщиком учетной системы, чтобы узнать, что они там изменили.

2. @Theo, Спасибо за ваш ответ, но я так не думаю : размер файла примерно одинаков, я могу скопировать / перенести текст из программы чтения PDF ( например, firefox ) в файл txt, поэтому я сомневаюсь, что он был преобразован в изображение. Я продолжаю копать

3. Я боюсь, что нам понадобится пример новых, неразрешимых PDF-файлов.

4. @mkl , добавлена ссылка на один из этих «неразборчивых PDF».. Кстати, пытаюсь с pdftotext.exe дайте мне «Незаконный ввод в CMap Юникода» и выведите те же нечитаемые символы. Спасибо, что уделили мне время.

5. Быстрый тест — попытка копирования и вставки из Adobe Reader — также приводит к появлению этих нечитаемых символов. Так что это действительно выглядит так, как будто внутри pdf что-то не так. Я посмотрю более внимательно позже.

Ответ №1:

короче говоря

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

В Деталях

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

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

Эти карты в текстовой форме должны содержать раздел codespacerange, который определяет природу кодов, в частности, составляет ли один байт или несколько байтов код для одного глифа. Затем в разделах bfchar и bfrange отдельные коды или диапазоны кодов должны быть сопоставлены с отдельными строками Юникода или их диапазонами соответственно. Коды и строки Юникода даны в шестнадцатеричной системе счисления в угловых скобках.

В вашем PDF-файле эти карты разбиты. Например, в случае шрифта 1 диапазон кодового пространства определяется как

 1 begincodespacerange
<00> <FF>
endcodespacerange
 

т. е. в виде однобайтовых кодов от 0x00 до 0xFF. Это правильно, шрифт является простым шрифтом и, следовательно, может содержать только однобайтовые коды. Но…

Затем этот шрифт использует только раздел bfchar для сопоставления этих кодов:

 66 beginbfchar
<0021> <0032#1>
<0022> <0036#1>
<0023> <0030#1>
<0024> <0020#1>
<0025> <0041#1>
<0026> <0076#1>
...
<005D> <0025#1>
<005E> <002C#1>
<005F> <004B#1>
<0060> <0062#1>
<0061> <00A0#1>
<0062> <0044#0>
endbfchar
 

и все записи в этом разделе сломаны!

С одной стороны, в соответствии с приведенным выше диапазоном кодового пространства у нас есть только однобайтовые коды , но здесь у нас есть только сопоставления для двухбайтовых кодов <0021> <0022> и т. Д. Поскольку диапазоны кода также могут быть смешанной длины, к длине кода следует отнестись серьезно, поэтому все эти двухбайтовые записи нельзя использовать для извлечения текста, поскольку шрифт не использует никаких двухбайтовых кодов.

С другой стороны, все значения этих сопоставлений нарушаются, потому что они содержат незаконную часть #1 или #0 . Здесь синтаксический анализатор может сразу игнорировать записи, потому что неясно, что это должно означать.

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

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

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