function getDecodedStream($stream, $options) { $data = ""; if (empty($options["Filter"])) { $data = $stream; } else { $length = !empty($options["Length"]) ? $options["Length"] : strlen($stream); $_stream = substr($stream, 0, $length); foreach ($options as $key => $value) { if ($key == "ASCIIHexDecode") { $_stream = decodeAsciiHex($_stream); } if ($key == "ASCII85Decode") { $_stream = decodeAscii85($_stream); } if ($key == "FlateDecode") { $_stream = decodeFlate($_stream); } } $data = $_stream; } return $data; }
function getDecodedStream($stream, $options) { // Итак, перед нами поток, возможно кодированный каким-нибудь // методом сжатия, а то и несколькими. Попробуем расшифровать. $data = ""; // Если у текущего потока есть свойство Filter, то он точно // сжат или зашифрован. Иначе, просто возвращаем содержимое // потока назад. if (empty($options["Filter"])) { $data = $stream; } else { // Если в опциях есть длина потока данных, то нам нужно обрезать данные // по заданной длине, а не то расшифровать не сможем или ещё какая // беда случится. $length = !empty($options["Length"]) && strpos($options["Length"], " ") === false ? $options["Length"] : strlen($stream); $_stream = substr($stream, 0, $length); // Перебираем опции на предмет наличия указаний на сжатие данных в текущем // потоке. PDF поддерживает много всего и разного, но текст кодируется тремя // вариантами: ASCII Hex, ASCII 85-base и GZ/Deflate. Ищем соответствующие // ключи и применяем соответствующие функции для расжатия. Есть ещё вариант // Crypt, но распознавать шифрованные PDF'ки мы не будем. foreach ($options as $key => $value) { if ($key == "ASCIIHexDecode") { $_stream = decodeAsciiHex($_stream); } if ($key == "ASCII85Decode") { $_stream = decodeAscii85($_stream); } if ($key == "FlateDecode") { $_stream = decodeFlate($_stream); } } $data = $_stream; } // Возвращаем результат наших злодейств. return $data; }