PHP: Blob из базы данных в tmpfile () - перемотка (или fseek) не работает - PullRequest
2 голосов
/ 22 ноября 2011

Мне нужно использовать ImageMagick-6.3.5, поэтому, чтобы обойти ошибку с readimageblob и pdf, я использую tmpfile ().

Я хочу получить предварительный просмотр первой страницы pdf,Я использую rewind (), чтобы быть на первой странице, но он все еще дает мне предварительный просмотр последней страницы ...

Что я могу сделать, чтобы получить предварительный просмотр первой страницы?

Установка более новой версии ImageMagick не возможна.

Я пытался сделать $ img-> readimagefile ($ temp. "[0]"), но он тоже не работает.

Вот мой код:

$image = Doctrine::getTable('Images')->find($id)
$img = new Imagick();
$temp = tmpfile();
fwrite($temp, $image->image);
rewind($temp);
$img->readimagefile($temp);
fclose($temp);
$img->setResolution(300,300);
$img->resizeImage($width,$height,Imagick::FILTER_LANCZOS,0);
$img->setImageFormat('png');
$img->writeImage ($url);

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

ImageMagick не читает напрямую PDF-файлы - для этого используется Ghostscript.Поэтому вместо того, чтобы полагаться на это, выполните преобразование самостоятельно, используйте программу pdftoppm и передайте ей соответствующие числа -f и -l.

Вы можете продолжать использовать «невидимые» временные файлы и использовать proc_open().Подготовьте один временный файл для ввода, а другой - для вывода.

Или сохраните файл с фактическим именем, сгенерируйте второе имя (используйте tempnam() для обоих), затем exec pdftoppm с этим именем иимя выходного файла.Затем пусть ImageMagick прочитает этот файл по имени, а не по дескриптору (обязательно удалите их после).

В любом случае вам понадобятся два временных файла.Я бы предпочел proc_open, так как вам не нужно беспокоиться об удалении файлов или об их потере в случае сбоя.Но это немного сложнее в использовании (не очень).

0 голосов
/ 23 ноября 2011

Я узнал, как это сделать: мы можем использовать: $ img-> setIteratorIndex (0)

Следующий код работает:

$image = Doctrine::getTable('Images')->find($id)
$img = new Imagick();
$temp = tmpfile();
fwrite($temp, $image->image);
rewind($temp);
$img->readimagefile($temp);
fclose($temp);
$img->setResolution(300,300);
$img->setIteratorIndex(0);
$img->resizeImage($width,$height,Imagick::FILTER_LANCZOS,0);
$img->setImageFormat('png');
$img->writeImage ($url);
...