Извлечение данных из /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