Как преобразовать документ PDF в изображение для предварительного просмотра в PHP?

Какие библиотеки, расширения и т. д. потребуются для преобразования части документа PDF в файл изображения?

Большинство библиотек PHP PDF, которые я нашел, сосредоточены на создании PDF-документов, но есть ли простой способ преобразовать документ в формат изображения, подходящий для использования в Интернете?

Наша среда представляет собой стек LAMP.


person Mathew Byrne    schedule 22.01.2009    source источник
comment
Я хотел бы иметь возможность сделать это и иметь файл с расширением .jpg. Я попробовал метод .htaccess AddHandler, и он не сработал.   -  person Keyslinger    schedule 18.05.2016


Ответы (10)


Вам нужны ImageMagick и GhostScript

<?php
$im = new imagick('file.pdf[0]');
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

[0] означает page 1.

person Paolo Bergantino    schedule 22.01.2009
comment
Да, это работает. Вы также можете сделать: $im-›setResolution( 300, 300 ), например, чтобы отобразить ваш PDF-файл с желаемым разрешением. - person Luis Melgratti; 22.01.2009
comment
Я не пробовал, но если вы используете документы Google и не возражаете против iFrame, это предложение может сработать (это также плагин для wp) forrst.com/posts/PDF_thumbnails_with_Google_Docs-6G6 - person David Hobs; 05.09.2012
comment
но как включить ImageMagick и GhostScript в файл php - person namratha; 29.11.2013
comment
@LuisMelgratti Хм, похоже, эта штука setResolution не работает. Я поставил его после строки $im = new imagick('file.pdf[0]'); из примера Паоло. Кажется, ничего не делает. Что, если мне нужно изображение из PDF-файла шириной, скажем, 1500, высотой для масштабирования и высоким разрешением? Как бы я это сделал? Спасибо. - person Lucas; 18.01.2014
comment
@think123 think123 используйте $im->thumbnailImage(1500, 0); Это установит для вашего jpg-изображения ширину 1500 и сохранит масштаб. см. документацию - person Kevin Jantzer; 21.01.2014
comment
Сколько времени потребуется, чтобы построить Imagick, я не могу долго ждать, он все еще строится... пьет кофе :D - person Ravi Dhoriya ツ; 13.02.2014
comment
Из моего ответа ниже: если вы загружаете PDF-файл из большого двоичного объекта, вы получаете первую страницу вместо последней: $im-›readimageblob($blob); $im-›setiteratorindex(0); - person jrjohnson; 17.07.2014
comment
@LuisMelgratti будет работать в Windows 7??? Можно ли установить на win 7?? - person user3784251; 24.02.2015
comment
Я пробовал, однако это дало мне: ошибка нет делегата декодирования для этого формата изображения `\path\filename.pdf' @ error/constitute.c/ReadImage/532. Я попробовал $exec = convert -scale $width $source $dest;exec($exec); и это сработало как шарм. - person Arvind K.; 25.08.2016
comment
Кто-нибудь из вас чувствовал, что это медленно? Я чувствовал, что это очень медленно, и хотел использовать только Ghostscript, который работает быстрее. Если кому-то из вас интересно, я написал для него обертку ">github.com/imalhasaranga/PDFLib - person imal hasaranga perera; 13.09.2016
comment
@Paolo Bergantino. Я пробовал ваш пример, но получаю следующую ошибку. Неустранимая ошибка: необработанное исключение «ImagickException» с сообщением «UnableToOpenBlob «file.pdf»: нет такого файла или каталога @ error/blob.c/OpenBlob/2657» в D:\xampp\htdocs\learn\index.php:39 Stack trace: #0 D:\xampp\htdocs\learn\index.php(39): Imagick-›__construct('file.pdf') #1 {main} брошен в D:\xampp\htdocs\learn\index.php в строке 39 - person scott; 15.09.2016
comment
Можете ли вы помочь мне в этом? - person scott; 15.09.2016
comment
Установите формат изображения на JPG, иначе изображение может неправильно отображаться в формате PNG. Большое Вам спасибо ;) - person Geoffrey Brier; 30.01.2017
comment
Если ссылка на Ghostscript не работает, вот страница Github: github.com/ArtifexSoftware/ghostpdl-downloads/ релизы - person Chris Happy; 01.02.2018
comment
Я использовал это, но решил, что сервер сериализует/кэширует полученную миниатюру. В следующий раз, когда API запрашивается для предоставления миниатюры, он проверяет, доступна ли кэшированная миниатюра, и предоставляет ее путем десериализации результирующего изображения. Благодаря этому методу поиск эскизов стал невероятно быстрым, и я даже не сохраняю их в базе данных. Вероятно, будет еще быстрее, если правильно хранить в БД. - person Robert Talada; 29.07.2019
comment
ImageMagick не предназначен для безопасной обработки ненадежных PDF-файлов. Включение обработки PDF-файлов опасно, если какие-либо вредоносные PDF-файлы когда-либо обрабатываются. из serverpilot.io/docs/ - person Avatar; 05.05.2021
comment
Как сохранить это изображение в переменной, которую можно напрямую использовать в <img src=""/> - person Ashish Patel; 19.05.2021

Для тех, у кого по какой-либо причине нет ImageMagick, также будут работать функции GD в сочетании с GhostScript. Запустите команду ghostscript с помощью exec(), чтобы преобразовать PDF в JPG, и управляйте полученным файлом с помощью imagecreatefromjpeg().

Запустите команду ghostscript:

exec('gs -dSAFER -dBATCH -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r300 -sOutputFile=whatever.jpg input.pdf')

Чтобы манипулировать, создайте новое изображение-заполнитель, $newimage = imagecreatetruecolor(...), и вставьте текущее изображение. $image = imagecreatefromjpeg('whatever.jpg'), а затем вы можете использовать imagecopyresampled() для изменения размера или любое количество других встроенных команд, отличных от imagemagick.

person Andrew    schedule 07.03.2011
comment
Чтобы просто получить изображение первой страницы, добавьте в команду ключи -dFirstPage=1 -dLastPage=1. - person Tim Dearborn; 03.12.2013
comment
Если он по-прежнему не работает, вам может потребоваться указать полный путь к двоичному файлу gs. - person craned; 29.01.2016
comment
Похоже, он выполняет системную команду. Что, если пользователь загрузит файл с именем something;rm -rf /? - person iProgram; 16.01.2018
comment
Если я хочу, чтобы вся страница PDF была преобразована в изображение. тогда как сделать? - person Dhara; 07.05.2018

Вы также можете получить количество страниц, используя

$im->getNumberImages();

Затем вы можете создавать превью всех страниц, используя цикл, например.

'file.pdf['.$x.']'
person Jason    schedule 24.01.2009
comment
(На самом деле это должен быть комментарий к ответу Паоло Бергантино) - person Simon East; 18.12.2013
comment
умный ответ. не дано другим, но вы заметили и написали. - person Ashu Kumar; 20.08.2018

Используйте расширение php Imagick. Чтобы контролировать желаемый размер выходного растрового изображения, используйте функция setResolution.

<?php    
$im = new Imagick();
$im->setResolution(300, 300);     //set the resolution of the resulting jpg
$im->readImage('file.pdf[0]');    //[0] for the first page
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

(Расширение ответа Паоло Бергантино и его комментария Луиса Мельгратти. Перед загрузкой изображения необходимо установить разрешение.)

person Sebastian    schedule 17.11.2014

Если вы загружаете PDF-файл из большого двоичного объекта, вы получаете первую страницу вместо последней:

$im->readimageblob($blob);
$im->setiteratorindex(0);
person jrjohnson    schedule 14.06.2011
comment
(На самом деле это должен быть комментарий к ответу Паоло Бергантино) - person Simon East; 18.12.2013

Вы также можете попробовать запустить утилиту «convert», которая поставляется с imagemagick.

exec("convert pdf_doc.pdf image.jpg");
echo 'image-0.jpg';
person Community    schedule 17.05.2012
comment
Вместо pdf_doc.pdf предпочтительнее использовать pdf_doc.pdf[0]. - person John Kurlak; 14.08.2012
comment
convert является частью пакета ImageMagick; попробуйте sudo yum установить ImageMagick - person Jack Miller; 18.11.2014
comment
Если он по-прежнему не работает, вам может потребоваться указать полный путь к двоичному файлу convert. - person craned; 29.01.2016
comment
echo 'image-0.jpg'; возвращает строку. - person suz; 01.12.2016

Я автор PDFlib, который является GhostScript оболочка для php, преимущество использования этой библиотеки в том, что она уже протестирована и не требует ImageMagic

Всегда GhostScript команды быстрее, чем ImageMagic, когда дело доходит до pdf, поэтому вам следует либо использовать оболочку GhostScript, либо чистые команды GhostScript.

$pdflib = new ImalH\PDFLib\PDFLib();
$pdflib->setPdfPath($pdf_file_path);
$pdflib->setOutputPath($folder_path_for_images);
$pdflib->convert();
person imal hasaranga perera    schedule 22.08.2017
comment
Привет, я использую вашу PDFlib для создания PNG из PDF-файлов. $pdflib = новый ImalH\PDFLib\PDFLib(); $pdflib-›setPdfPath($pdf_file_path); $pdflib-›setOutputPath($folder_path_for_images); $pdflib- ›setImageFormat(\ImalH\PDFLib\PDFLib::$IMAGE_FORMAT_PNG); $pdflib-›setDPI(100); $pdflib-›setPageRange(1,$pdflib-›getNumberOfPages()); $pdflib-›convert(); Есть ли в PDFlib возможность устанавливать ширину и высоту создаваемых файлов PNG? - person WGS; 08.03.2018
comment
Привет, PDFLib не предоставляет методов для управления изображениями, но вы можете сделать это. после того, как вы сгенерировали png с помощью PDFLib, вы можете использовать другую библиотеку для обработки изображений, например github.com/Treinetic/ImageArtist чтобы выполнить свою работу... - person imal hasaranga perera; 08.03.2018
comment
Пожалуйста, попробуйте описанный выше метод, который я предложил, но если вы все еще испытываете затруднения, отправьте мне письмо по адресу [email protected], и я помогу вам с образцом кода... ура! - person imal hasaranga perera; 08.03.2018
comment
Я попробую. Спасибо за предложение. - person WGS; 08.03.2018

Думайте по-другому. Вы можете использовать следующую библиотеку для преобразования pdf в изображение с помощью javascript.

http://usefulangle.com/post/24/pdf-to-jpeg-png-with-pdfjs

person jewelhuq    schedule 29.03.2018
comment
Если я хочу отобразить изображение для предварительного просмотра на сервере, как мы можем это использовать? - person chithra; 14.02.2019
comment
Вы можете взглянуть на это: github.com/scandel/pdfThumbnails. Я думаю, вы можете загрузить миниатюру изображения, сгенерированную здесь, вместе с фактическим файлом и сохранить ее, таким образом вы сэкономите больше вычислительного времени на своем сервере (поскольку процесс миниатюры выполнялся на клиентском компьютере). - person sajed zarrinpour; 10.09.2019
comment
И только получение и разрешение файла изображения является более безопасным, чем использование ImageMagick для ненадежных PDF-файлов. - person Avatar; 05.05.2021
comment
Единственная проблема с этим решением: необходимый pdf .min.js имеет размер 328 КБ. - person Avatar; 05.05.2021

Устанавливаю готово! Это сработало!

Вы можете сделать базовую установить imagemagick в Windows .

В php (local) используйте вызов exec(<command line>) например:

<?php
$pdf = "filename.pdf";
$info = pathinfo($pdf);
$file_name =  basename($pdf,'.'.$info['extension']);
echo $file_name;
$pdf = "filename.pdf[0]";
exec("convert $pdf convert-img/$file_name.jpg");    
?>

Кроме того, вы можете использовать class imagick в классе PHP Imagick.

Спасибо все мне помогли!

person Duy Khanh    schedule 07.04.2012

Вот простой класс, который я написал и использовал в нескольких проектах. Он просто оборачивает imagick и обрабатывает запись каждой страницы на диск. Если кто-то все еще ищет простой способ сделать это, эта ссылка может оказаться полезной.

person user664995    schedule 11.05.2012
comment
Ответы только по ссылке имеют низкую ценность в StackOverflow, потому что, если ссылка перемещается или умирает, ответ становится абсолютно бесполезным. Чтобы улучшить ваш ответ, основная часть вашего решения должна быть жестко закодирована здесь. - person mickmackusa; 13.02.2019