Извлечение данных из /Filter / FlateDecode PDF stream в PHP

Я не могу расшифровать данные из потока, как:

    56 0 obj 
    << /Length 1242 /Filter /FlateDecode >>
    stream
    x]êΩnƒ Ñ{ûbÀKq¬æâê¢....(whole binary is omitted)
    endstream
    endobj

Я попытался изолировать двоичный контент (x]êΩnƒ Ñ{ûbÀKq¬æâê¢....) в файле и в двоичной строке. Функция декодирования gzinflate($encripted_data) отправляет мне ошибку декодирования, и я думаю, что это происходит потому, что закодированное содержимое не "сдуто" или около того.

в PDF Reference v 1.7, (six edition), на странице 67, я нашел описание фильтра /FlateDecode как: ...Распаковывает данные, закодированные с помощью метода сжатия zlib/deflate, воспроизведение исходного текста или двоичных данных

мне нужно реальное сырое решение, он же php-функция или / и алгоритм, что делать с этим потоком" FlateDecoded".

Спасибо!

4 ответов


так как вы не сказали, Если вам нужно получить доступ один только распакованный поток или если вам нужны все распакованные потоки, я предложу вам простой инструмент командной строки, который делает это за один раз для полного PDF: Jay Berkenbilt's qpdf.

пример командной строки:

 qpdf --qdf --object-streams=disable in.pdf out.pdf

out.pdf затем можно проверить в текстовом редакторе (только встроенные профили ICC, изображения и шрифты все еще могут быть двоичными).

qpdf будет автоматически переупорядочивает объекты и отображает синтаксис PDF нормализованным образом (и сообщает вам в комментарии, каким был исходный идентификатор объекта де-сжатого объекта).

если вам потребуется снова сжать файл (возможно, после его редактирования), просто запустите эту команду:

 qpdf out-edited.pdf out-recompressed.pdf

(вы можете увидеть предупреждающее сообщение, сообщающее, что утилита пыталась восстановить поврежденный файл....)

qpdf - это мульти-платформа и доступные от Sourceforge.


header('Content-Type: text');           // I going to download the result of decoding
$n = "binary_file.bin";                 // decoded part in file in a directory
$f = @fopen($n, "rb");                  // now file is mine
$c = fread($f, filesize($n));           // now I know all about it 
$u = @gzuncompress($c);                 // function, exactly fits for this /FlateDecode filter
$out = fopen("php://output", "wb");     // ready to output anywhere
fwrite($out, $u);                       // output to downloadable file

колокольчики! Колокольчики звенят!...

gzuncompress() - решение


давно пора, но кто-то может найти это полезным. В этом деле: > все, что вам нужно, это передать изолированную двоичную строку (так что в основном все между "stream" и "endstream") в zlib.распаковать:

import zlib
stream = b"êΩnƒ Ñ{ûbÀKq¬æ\âê"  # binary stream here
data = zlib.decompress(stream) # Here you have your clean decompressed stream

однако, если у вас есть/DecodeParms в вашем объекте PDF, все усложняется. Вам понадобится значение / Predictor и номер столбцов. Для этого лучше использовать PyPDF2.


Я просто использовать

import de.intarsys.pdf.filter.FlateFilter;

из jpod / источник forge и это работает хорошо

FlateFilter filter = new FlateFilter(null);
byte[] decoded = filter.decode(bytes, start, end - start);

байты прямо из файла pdf