Обработка несжатого потока

Я только недавно сел и попытался написать небольшой фрагмент кода, который мог бы прочитать в файле .pdf, получить определенные потоки (или только один в этом случае), распаковать его и … попытаться выдать читаемый текст, так что в основном в ASCII.
Из словаря в потоке я знаю, что его фильтр — DecodeFlate. Под руководством это означает сжатие через zlib. Я нашел здесь пример на stackoverflow, где было упомянуто, что нужно использовать gzuncompress, чтобы это исправить.
Итак, это мой фрагмент кода.

$file = ('mypdf.pdf');
$data = fopen($file, "rb");
$size = filesize($file);
$contents = fread($data,$size);
fclose($data);
// irrelevant code finding a certain xx 0 obj and setting start_pos to it
$start_pos = strpos($contents,'stream', $start_pos);
$end_pos = strpos($contents,'endstream', $start_pos);
$start_pos = $start_pos +8;
$end_pos = $end_pos -2;
$substring = substr($contents, $start_pos, $end_pos);
$result = gzuncompress($substring);
echo $substring;

Думаю, до этого момента все работает как надо. Поток найден, и его длина такая же, как указано в его словаре. Также работает гзункомпресс. На данный момент, однако, я понятия не имею, как продолжить.
Я получаю несколько следующий результат:

q 1 0 0 -1 0 841.889 cm q 1 0 0 1 70.866 28.346 cm 0 g /P <> BDC BT /F21 8 Tf 1 0 0 -1 0 19.17900085 Tm [<002800090016001000010005001000110001001A00120006000500130010000A00140009000A00140011001F>] TJ ET EMC /P <> BDC BT /F21 8 Tf 1 0 0 -1 0 28.77899933 Tm

И так далее, много [<….>] и прочее. И я не знаю, как продолжать дальше. Или, если это вообще возможно.

заранее спасибо

1

Решение

Когда я углубился в это, я заметил несколько вещей о структуре этих PDF-файлов.
Поскольку они в основном все одинаковые, я могу немного их использовать.
Присутствуют только 2 типа шрифтов, F21 и F22. Оба определяются перед определенным объектом и применяются к нему до конца документа.
Для начального запуска я должен распаковать потоки, проверить, присутствует ли CIDMap в декодированной части. Если да, создайте CMap.
Затем я могу перебрать объекты, содержащие данные, которые я хочу, и преобразовать значения Hex в соответствующий UTF8 через CMap, и все должно быть сделано.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector