Como faço para converter um documento PDF em uma imagem de visualização em PHP? [fechadas]

199

Quais bibliotecas, extensões etc. seriam necessárias para renderizar uma parte de um documento PDF em um arquivo de imagem?

A maioria das bibliotecas PDF PHP que encontrei se concentra na criação de documentos PDF, mas existe uma maneira simples de renderizar um documento para um formato de imagem adequado para uso na Web?

Nosso ambiente é uma pilha LAMP.

Mathew Byrne
fonte
Eu adoraria poder fazer isso e ter o arquivo com uma .jpgextensão. Eu tentei o método .htaccess AddHandler e não funcionou.
Keyslinger

Respostas:

228

Você precisa ImageMagickeGhostScript

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

Os [0]meios page 1.

Paolo Bergantino
fonte
11
sim funciona Você também pode fazer: $ im-> setResolution (300, 300), por exemplo, para renderizar seu pdf na resolução desejada.
Luis Melgratti
6
Eu não tentei, mas se você estiver usando o Google Docs e não se importa com o iFrame, esta sugestão pode funcionar (também é um plugin wp) forrst.com/posts/PDF_thumbnails_with_Google_Docs-6G6
David Hobs,
4
mas como incluir ImageMagick e GhostScript no arquivo php
namratha 29/11
1
@ think123 use $im->thumbnailImage(1500, 0);Isso definirá sua imagem jpg para uma largura de 1500 e manterá a escala. Veja a documentação
Kevin Jantzer
1
Da minha resposta abaixo - Se você está carregando o PDF de um blob, é assim que você obtém a primeira página, e não a última: $ im-> readimageblob ($ blob); $ im-> setiteratorindex (0);
Jrjohnson 17/07/2014
34

Para aqueles que não têm o ImageMagick por qualquer motivo, as funções GD também funcionarão em conjunto com o GhostScript. Execute o comando ghostscript com exec()para converter um PDF em JPG e manipule o arquivo resultante com imagecreatefromjpeg().

Execute o comando ghostscript:

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

Para manipular, crie uma nova imagem de espaço reservado $newimage = imagecreatetruecolor(...)e traga a imagem atual. $image = imagecreatefromjpeg('whatever.jpg')e, em seguida, você pode usar imagecopyresampled()para alterar o tamanho ou qualquer número de outros imagemagickcomandos não internos

Andrew
fonte
3
Para obter apenas uma imagem da primeira página, adicione as opções -dFirstPage = 1 -dLastPage = 1 ao comando.
Tim Dearborn
Se ainda não estiver funcionando, pode ser necessário fornecer o caminho completo para o gsbinário.
craned
Parece que está executando um comando do sistema. E se o usuário enviar um arquivo com o nome something;rm -rf /?
IProgram
Se eu quiser que toda a página do pdf seja convertida em imagem. então como fazer?
Dhara
31

Você também pode obter a contagem de páginas usando

$im->getNumberImages();

Então você pode criar miniaturas de todas as páginas usando um loop, por exemplo.

'file.pdf['.$x.']'
Jason
fonte
34
(Isso deve realmente ser um comentário sobre a resposta de Paolo Bergantino)
Simon Médio
resposta inteligente. não é dado por outro, mas você percebe e escreveu.
Ashu Kumar
16

Use a extensão php Imagick . Para controlar o tamanho desejado da imagem de saída raster, use a função 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;
?>

(Extensão sobre Paolo Bergantino, sua resposta, e Luis Melgratti, seu comentário. Você precisa definir a resolução antes de carregar a imagem.)

Sebastian
fonte
11

Se você estiver carregando o PDF a partir de um blob, é assim que você obtém a primeira página em vez da última página:

$im->readimageblob($blob);
$im->setiteratorindex(0);
jrjohnson
fonte
10
(Na verdade, isso deve ser um comentário sobre a resposta de Paolo Bergantino)
Simon East
9

Você também pode tentar executar o utilitário 'converter' que acompanha o imagemagick.

exec("convert pdf_doc.pdf image.jpg");
echo 'image-0.jpg';
Preet Sandhu
fonte
3
Em vez de pdf_doc.pdf, pdf_doc.pdf [0] é o preferido.
John Kurlak
O convert faz parte do pacote ImageMagick; tente sudo yum instale o ImageMagick
Jack Miller
Se ainda não estiver funcionando, pode ser necessário fornecer o caminho completo para o convertbinário.
craned 29/01
1
echo 'image-0.jpg';retorna uma string.
suz
trabalhou para mim, graças
Isabella
4

Eu sou o autor do PDFlib, que é um wrapper GhostScript para php, a vantagem de usar esta biblioteca é que ela já foi testada e não requerImageMagic

Sempre os GhostScriptcomandos são mais rápidos do que ImageMagicquando se trata de pdf, portanto, você deve optar por um wrapper GhostScript ou comandos puros do GhostScript

$pdflib = new ImalH\PDFLib\PDFLib();
$pdflib->setPdfPath($pdf_file_path);
$pdflib->setOutputPath($folder_path_for_images);
$pdflib->convert();
imal hasaranga perera
fonte
Olá, estou usando seu PDFlib para criar PNGs a partir de PDFs. $ pdflib = novo 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 (); O PDFlib tem uma opção para definir a largura e a altura dos arquivos PNG criados?
WGS
Olá, o PDFLib não fornece métodos para manipular imagens, mas você pode fazer assim. uma vez que você gerou os pngs usando PDFlib você pode usar outro libraray manipulação de imagem como github.com/Treinetic/ImageArtist para fazer o seu trabalho ...
IMAL hasaranga perera
por favor, tente o método acima sugerido, mas se você ainda estiver com problemas, envie-me um e-mail para [email protected] e eu ajudarei você com um código de exemplo ... Saúde !!
Imal hasaranga perera # 8/18
Vou tentar. Obrigado pela sugestão.
WGS
3

Eu instalo terminado! Funcionou!

Você pode instalar o imagemagick no Windows.

Na php (local)chamada uso exec(<command line>) ex:

<?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");    
?>

Além disso, você pode ser usado class imagickna classe PHP Imagick

Obrigado a todos me ajudaram!

Duy Khanh
fonte
2

Pense de maneira diferente, você pode usar a seguinte biblioteca para converter pdf em imagem usando javascript

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

jewelhuq
fonte
Se eu quiser exibir a imagem de visualização no servidor, como podemos usá-la?
Chithra
Você pode dar uma olhada nisto: github.com/scandel/pdfThumbnails . Eu acho que você pode fazer upload da miniatura da imagem gerada aqui ao lado do arquivo real e salvá-la, dessa forma você economizará mais tempo computacional no servidor (desde que o processo de miniaturas tenha sido feito em um computador do lado do cliente).
você precisa saber é o seguinte
1

Aqui está uma classe simples que eu escrevi e usei em alguns projetos. Apenas envolve imagicke lida com a gravação de cada página no disco. Se alguém ainda estiver procurando uma maneira fácil de fazer isso, esse link poderá ser útil.

user664995
fonte
2
As respostas somente de link são de baixo valor no StackOverflow porque, se o link se move ou morre, a resposta é totalmente inútil. Para melhorar sua resposta, a maior parte da sua solução deve ser codificada aqui.
Mckmackusa