Come convertire un documento PDF in un`immagine in anteprima in PHP?

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
In questo post, però, ci limiteremo a un esempio molto più piccolo, ovvero creare un`anteprima di un`immagine da un determinato documento PDF. "Perché un`anteprima?‚", chiedi. Bene, potrebbe essere necessario per il suo sistema di gestione della biblioteca, il suo negozio di ebook online o solo per qualche folle attività di programmazione del fine settimana. Dove pensi di poter utilizzare questo concetto nel tuo progetto? Lascia che me lo so nei commenti.Non è più possibile implementare un algoritmo di conversione completo da zero, quindi utilizzeremo librerie di terze parti per semplificare il nostro compito.Le tecniche che ho trovato interessanti in questo scenario si basano sui seguenti strumenti:
  • Ghostscript:è un`utilità da riga di comando disponibile per tutte e tre le principali piattaforme, vale a dire Windows, Linux e Mac che interpretano file PostSript e PDF. Puoi leggere di più su questo sito ufficiale .
  • ImageMagick:Questo è un pacchetto software gratuito e open source per visualizzare, convertire e modificare immagini raster e file di immagini vettoriali. È disponibile per la maggior parte dei principali linguaggi di programmazione ‚Äã‚Äãincluso PHP. Ecco la documentazione standard per una rapida panoramica .
U cantare Ghostscript Per usare Ghostscript nel tuo progetto, inizia installandolo. Se sei su Windows, scarica l`eseguibile dalla pagina di download. Gli utenti Linux possono installare Ghostscript direttamente attraverso i gestori di pacchetti predefiniti;
# distribuzioni basate su RPM, Fedora 26/27/28 $sudo dnf install ghostscript 
Verifica l`installazione con questo comando,
$gs --version 
Dopo l`installazione, accedere alla directory contenente il file PDF ed eseguire il comando seguente.
$gs -dSAFER -dBATCH -sDEVICE = jpeg -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -dFirstPage = 1 -dLastPage = 1 -r300 -sOutputFile = preview.jpg input.pdf Questo creerà un`immagine della prima pagina del documento. Capiamo cosa fa effettivamente;
  • -sDEVICE:imposta il formato del file immagine di output.
  • -sTEXTVAL, - sGRAPHICVAL: imposta l`anti-alias per l`immagine risultante. I valori validi ‚Äã‚Äãsono 1, 2 e 4.
  • -r {NUM}:imposta la risoluzione (in dpi) dell`immagine.
  • -sFirstPage, -sLastPage:imposta la prima e l`ultima pagina del documento da visualizzare.
  • -sOutputFile:imposta il nome dell`output file.
  • input.pdf:questo è il vero documento PDF utilizzato per la conversione.
Ora, per usare questo comando in PHP, dobbiamo chiama la funzione exec(). Ad esempio: exec ( "ls -l" , $output_str , $return_val ); foreach ( $output_str as $line ) { eco $line . "" ; }
?>; Questo esempio su Linux eseguirà ls e stamperà tutte le directory e i file sulla console. Possiamo usare questo concetto ed eseguire un comando dal nostro codice PHP. Ecco come l`ho fatto;< tbody> funzione is_pdf ( $file ) { $file_content = file_get_contents ( $file ) ; if (preg_match ( " / ^% PDF- [0-1 ]. [0-9] + / " , $file_content )) { return true; } else { ritorno false; } } funzione create_preview ( $file ) { $output_format = "jpeg" ; $antialias = "4" ; $preview_page = "1" ; $risoluzione = "300" ; $file_output = "preview.jpg" ; $exec_command = " gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE = " . $output_format . "" ; $exec_command . = "- dTextAlphaBits =" . $antialias . "-dGraphicsAlphaBits =" . $antialias . "" ; $comando_exec . = "- dFirstPage =" . $preview_page . "-dLastPage =" . $preview_page . "" ; $comando_exec . = "- r" . $risoluzione . "" ; $exec_command . = "- sOutputFile =" . $file_output . "` " . $file . "` " ; echo " Esecuzione del comando ... " ; exec ( $exec_command , $command_output , $ return_val ); foreach ( $command_output as $line ) { eco $line . "" ; } se (! $return_val ) { echo "Anteprima creata con successo!!" ; } altro { echo "Errore durante la creazione dell`anteprima." ; } } funzione __ main __() { globale $argv ; $input_file = $argv [1]; se (is_pdf ( $input_file )) { // Crea anteprima PDF create_preview ( $input_file ); } else { echo "Il file di input" . $input_file . "non è un documento PDF valido." ; } }
__ main __();
?>
Stella di esecuzione ts con __main __() che accetta un file PDF sulla riga di comando. Verifica se il file di input è PDF valido o meno. Se valido, esegue il comando sul file di input.
Exit:
$php pdf_preview.php input.pdf Excuting command ... GPL Ghostscript 9.22 (2017-10-04) Copyright (C) 2017 Artifex Software, Inc. Tutti i diritti riservati. Questo software viene fornito SENZA GARANZIA: vedere il file PUBLIC per i dettagli. Elaborazione delle pagine da 1 a 1. Pagina 1 Anteprima creata con successo !! 
Usare ImageMagick Come al solito, inizieremo installando i binari di ImageMagick sul sistema. Cominciamo con le dipendenze;
$sudo dnf install gcc php-devel php-pear 
Quindi installa ImageMagick;
$sudo dnf install ImageMagick ImageMagick-devel 
Quindi installa le classi PHP wrapper;
$sudo pecl install imagick $sudo bash -c "echo" extension = imagick.so "> / etc /php.d/imagick.ini "
Se prevedi di usarlo nell`architettura LAMP, considera di riavviare il server web Apache;
$sudo service httpd restart 

Ora che il nostro sistema è pronto, possiamo usare ImageMagick nel nostro progetto di esempio. La funzionalità di base dello script rimane la stessa. Tutto quello che devi fare è sostituire il contenuto della funzione create_preview() con il codice seguente.funzione create_preview ( $file ) { $output_format = "jpeg" < codice>; $preview_page = "1" ; $risoluzione = "300" ; $file_output = "imagick_preview.jpg" ; echo " Anteprima in corso ... " ; $img_data = nuovo Imagick(); $img_data -> setResolution ( $risoluzione , $risoluzione ); $img_data -> readImage ( $file . "[" . ( $preview_page - 1). " ] " ); $img_data -> setImageFormat ( $output_format ); file_put_contents ( $file_output , $img_data , FILE_USE_INCLUDE_PATH ); } Il codice è autoesplicativo. Definiamo un`istanza di tipo Imagick e impostiamo vari parametri come risoluzione, formato file, ecc. La pagina PDF che desideri visualizzare viene definita indice di matrice dopo il nome del file. Ad esempio:

Prima pagina: input.pdf [0] Seconda pagina: input.pdf [1]. ... ... Nesima pagina: input.pdf [N - 1] 
Output:
$php pdf_preview.php input.pdf Anteprima di recupero ... Alcuni di voi potrebbero ti chiedi perché usare questo metodo rispetto al precedente. Bene, ho trovato ImageMagick per abbinare abbastanza bene il codice PHP. La riga di comando nella programmazione non sembra molto buona e talvolta diventa di dominio pubblico. Tuttavia, con lo stesso set di configurazioni, Ghostscript ha prodotto file di immagine più piccoli rispetto ai file prodotti da ImageMagick. Non sono sicuro che ciò sia dovuto ad alcuni problemi di ottimizzazione, ma non è questa la differenza. La scelta dell`uno rispetto all`altro si basa semplicemente sui tuoi gusti. Ecco come creare un`anteprima per un determinato documento PDF. Spero che tu abbia imparato qualcosa di nuovo da questo post. Quale metodo preferiresti? Qualche suggerimento per ulteriori miglioramenti? Sentiti libero di menzionarli nei commenti.