Como converter um documento PDF em uma imagem de visualização em PHP?

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Neste post, no entanto, vamos nos limitar a um exemplo bem menor, que é criar uma prévia de uma imagem a partir de um determinado documento PDF. "Por que uma prévia?‚", você pergunta. Bem, pode ser necessário para o sistema de gerenciamento de biblioteca dele, sua loja de e-books online ou apenas alguma tarefa maluca de programação de fim de semana. Onde você acha que pode usar esse conceito em seu projeto? Vamos me saiba nos comentários. Não é mais possível implementar um algoritmo de conversão completo do zero, então usaremos bibliotecas de terceiros para facilitar nossa tarefa. As técnicas que achei atraentes neste cenário são baseadas nas seguintes ferramentas:
  • Ghostscript:é um utilitário de linha de comando disponível para todas as três principais plataformas, como Windows, Linux e Mac, que interpretam arquivos PostSript e PDF. Você pode ler mais sobre isso em seu site oficial .
  • ImageMagick:Este é um pacote de software gratuito e de código aberto para exibir, converter e editar imagens raster e arquivos de imagem vetorial. Está disponível para a maioria das principais linguagens de programação ‚Äã‚Äãincluindo PHP. Aqui está a documentação padrão para visão geral rápida .
U sing Ghostscript Para usar o Ghostscript em seu projeto, comece instalando-o. Se você estiver no Windows, baixe o executável na página de download. Os usuários do Linux podem instalar o Ghostscript diretamente pelos gerenciadores de pacotes padrão;
# distribuições baseadas em RPM, Fedora 26/27/28 $sudo dnf install ghostscript 
Verificar a instalação com este comando,
$gs --version 
Após a instalação, navegue até o diretório que contém o arquivo PDF e execute o seguinte comando.
$gs -dSAFER -dBATCH -sDEVICE = jpeg -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -dFirstPage = 1 -dLastPage = 1 -r300 -sOutputFile = preview.jpg input.pdf Isso criará uma imagem da primeira página do documento. Vamos entender o que ele realmente faz;
  • -sDEVICE:define o formato do arquivo de imagem de saída.
  • -sTEXTVAL, - sGRAPHICVAL: define o anti-aliasing para a imagem resultante. Os valores válidos ‚Äã‚Äãsão 1, 2 e 4.
  • -r {NUM}:define a resolução (em dpi) da imagem.
  • -sFirstPage, -sLastPage:configura a primeira e a última página do documento a ser exibida.
  • -sOutputFile:configura o nome da saída arquivo.
  • input.pdf:este é o documento PDF real que é usado para converter.
Agora, para usar este comando em PHP, nós chame a função exec(). Por exemplo: exec ( "ls -l" , $output_str , $return_val ); foreach ( $output_str as $line ) { echo $line . "" ; }
?>; Este exemplo no Linux executará ls e imprimirá todos os diretórios e arquivos no console. Podemos usar este conceito e execute um comando do nosso código PHP. Foi assim que eu fiz;< tbody> função is_pdf ( $file ) { $file_content = file_get_contents ( $file ) ; if (preg_match ( " / ^% PDF- [0-1 ]. [0-9] + / " , $file_content )) { return true; } else { return false; } } função create_preview ( $file ) { $output_format = "jpeg" ; $antialiasing = "4" ; $preview_page = "1" ; $resolution = "300" ; $output_file = "preview.jpg" ; $exec_command = " gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE = " . $output_format . "" ; $exec_command . = "- dTextAlphaBits =" . $antialiasing . "-dGraphicsAlphaBits =" . $antialiasing . "" ; $exec_command . = "- dFirstPage =" . $preview_page . "-dLastPage =" . $preview_page . "" ; $exec_command . = "- r" . $resolution . "" ; $exec_command . = "- sOutputFile =" . $output_file . "` " . $file . "` " ; echo " Executando comando ... " ; exec ( $exec_command , $command_output , $ return_val ); foreach ( $command_output as $line ) { echo $line . "" ; } if (! $return_val ) { echo "Visualização criada com sucesso !!" ; } outro { echo "Erro ao criar a visualização." ; } } função __ main __() { global $argv ; $input_file = $argv [1]; if (is_pdf ( $input_file )) { // Criar visualização de PDF create_preview ( $input_file ); } else { echo "O arquivo de entrada" . $input_file . "não é um documento PDF válido." ; } }
__ main __();
?>
Estrela de execução ts com __main __() que aceita um arquivo PDF na linha de comando. Verifica se o arquivo de entrada é um PDF válido ou não. Se válido, ele executa o comando no arquivo de entrada.
Sair:
$php pdf_preview.php input.pdf Excuting command ... GPL Ghostscript 9.22 (2017-10-04) Copyright (C) 2017 Artifex Software, Inc. Todos os direitos reservados. Este software não possui GARANTIA: consulte o arquivo PUBLIC para detalhes. Processando as páginas 1 a 1. Página 1 Visualização criada com sucesso !! 
Usando o ImageMagick Como de costume, vamos começar instalando os binários do ImageMagick no sistema. Vamos começar com as dependências;
$sudo dnf install gcc php-devel php-pear 
Em seguida, instale o ImageMagick;
$sudo dnf install ImageMagick ImageMagick-devel 
Em seguida, instale as classes PHP wrapper;
$sudo pecl install imagick $sudo bash -c "echo" extension = imagick.so "> / etc /php.d/imagick.ini "
Se você planeja usá-lo na arquitetura LAMP, considere reiniciar o servidor web Apache;
$sudo service httpd restart 

Agora que nosso sistema está pronto, podemos usar o ImageMagick em nosso projeto de amostra. A funcionalidade básica do script permanece a mesma. Tudo o que você precisa fazer é substituir o conteúdo da função create_preview() pelo código a seguir.function create_preview ( $file ) { $output_format = "jpeg" ; $preview_page = "1" ; $resolution = "300" ; $output_file = "imagick_preview.jpg" ; echo " Buscando visualização ... " ; $img_data = new Imagick(); $img_data -> setResolution ( < código>$resolução , $resolução ); $img_data -> readImage ( $file . "[" . ( $preview_page - 1). " ] " ); $img_data -> setImageFormat ( $output_format ); file_put_contents ( $output_file , $img_data , FILE_USE_INCLUDE_PATH ); } O código é autoexplicativo. Definimos uma instância do tipo Imagick e definimos vários parâmetros como resolução, formato de arquivo, etc. A página PDF que você deseja exibir é chamada de índice de matriz após o nome do arquivo. Por exemplo:

Primeira página: input.pdf [0] Segunda página: input.pdf [1]. ... ... Enésima página: input.pdf [N - 1] 
Saída:
$php pdf_preview.php input.pdf Buscando visualização ... Alguns de vocês podem estar se perguntando por que usar este método sobre o anterior. Bem, eu achei o ImageMagick para combinar muito bem com o código PHP. A linha de comando na programação não parece muito boa e às vezes se torna de conhecimento comum. No entanto, com o mesmo conjunto de configurações, o Ghostscript produziu arquivos de imagem menores do que os arquivos produzidos pelo ImageMagick. Não tenho certeza se isso se deve a alguns problemas de otimização, mas essa não é a diferença. Escolher um sobre o outro é simplesmente baseado em seu próprio gosto. Então é assim que você cria uma visualização para um determinado documento PDF. Espero que você tenha aprendido algo novo com este post. Qual método você prefere? Alguma sugestão para outras melhorias? Sinta-se à vontade para mencioná-los nos comentários.