Извлечение содержимого из файла PDF может стать немного сложным. Я делаю это как свою ежедневную работу и думаю, что могу указать вам правильное направление.
То, что вы пытаетесь сделать (извлечение строки в скобках), работает только с простой кодировкой WinAnsi или MacRoman, используемой со шрифтами Type1 или TrueType. К сожалению, эти однобайтовые кодировки не поддерживают надлежащий контент Unicode. Ваш образец документа использует шрифты Type0 или CID, где каждый символ идентифицируется индексом глифа. Это нестандартные специальные кодировки, в которых разработчик шрифта может произвольно назначить индекс глифа любому символу. Иногда производитель PDF намеренно искажает кодировку.
Как это работает, начиная с каталога, вы анализируете дерево страниц. Как только вы идентифицируете объект страницы, вы анализируете его содержимое и ресурсы. Словарь ресурсов содержит список шрифтов, используемых страницей. Каждый объект шрифта CID содержит поток ToUnicode, который является картой (символьной картой), которая устанавливает связь между индексами глифа и их значением Unicode. Например:
<01> <0044>
<02> <0061>
<03> <0074>
<04> <0020>
Это означает, что глиф 01 - это Unicode U + 0044, глиф 02 - это U + 0061 и т. Д. Вы должны использовать эту справочную таблицу для перевода идентификаторов глифов обратно в Юникод.
Сам контент страницы имеет два важных оператора для вас. Tf
является селектором шрифта, который важен, потому что он идентифицирует объект шрифта. Каждый шрифт имеет свою собственную карту ToUnicode, поэтому в зависимости от шрифта вы должны использовать другую справочную таблицу.
Другим интересным оператором является текстовое шоу (обычно TJ
или Tj
). С шрифтами Type0 (CID) Tj
не содержит читабельного текста, а представляет собой последовательность идентификаторов глифов, которые вы должны отобразить в Unicode с помощью вышеупомянутого cmap. Часто Tj
использует шестнадцатеричную строку, такую как <000100a50056> Tj
, вместо более типичного (Hello, World) Tj
, с которым вы знакомы. В любом случае, строка не читается человеком и не может быть извлечена без полного анализа страницы, включая все ресурсы шрифта, особенно. карта ToUnicode, которая сама по себе является объектом PostScript, но вы заботитесь только о шестнадцатеричных частях.
Конечно, я упростил процесс, потому что существуют десятки различных стандартных кодировок, пользовательских кодировок (дифференциальных или ToUnicode), и мы даже не затрагивали арабский, хинди, вертикальные японские шрифты, шрифты типа 3 и т. Д. Иногда текст вообще не может быть извлечен, потому что он преднамеренно искажен.