Making PDF Thumbnail From PHP Using Imagemagick and Ghostscript

ImageMagick mungkin sebuah pengalaman baru buat gw, cukup menarik karena dia bisa digunakan untuk banyak hal yang tidak bisa dilakukan oleh GDLib biasa. Sebut saja membuat thumbnail Photoshop file, dan banyak file lainnya yang tidak bisa juga dibuka atau dibaca oleh GDLib.

Kali ini gw mencoba menjelaskan bagaimana membuat thumbnail PDF dengan bantuan Imagemagick. Tetapi untuk membuat thumbnail ini, Imagemagick membutuhkan bantuan sebuah program lainnya, yaitu Ghostscript. Keduanya meruapakan freeware(untuk Imagemagick, mungkin bisa dilihat di posting gw sebelumnya).

Pertama-tama gw mendapatkan caranya dari sini.  Tutorial di web tsb dibuat untuk Linux, tetapi gw mencobanya under Windows dan mendapatinya berhasil.

Intinya, untuk mengextract Thumbnail dari PDF:

convert -thumbnail [width]x[height] [your PDF file w/ full path] [Your result thumbnail file w/ full path]

Apabila terjadi error, kemungkinan Goshcript tidak bisa terakses. Coba pindahkan file “gswin32c.exe” ke root drive C di windows.

Lalu bagaimana dengan PHP, bagaimana kita bisa menggabungkannya dengan PHP supaya bisa jadi satu dalam sebuah aplikasi?

Simple, PHP punya beberapa function untuk mengakses commandline program atau menjalankan shell syntax. beberapa diantaranya yaitu “system,shell_exec,exec,popen,etc”.

Pertama gw mencobanya dengan menggunakan shell_exec. tetapi tidak bekerja di dalam Windows. Setelah beberapa lama mencarinya, Akhirnya menemukan caranya dengan menggunakan “popen”.

Berikut ini gw membuat Class-nya agar mudah digunakan:

<?php
/**
 * Class ini digunakan untuk membuat thumbnail dari PDF, menggunakan
 * imagemagick dan juga ghost script. Pindahkan gswin32c.exe ke root C
 * Apabila terjadi kegagalan mungkin akan membantu menyelesaikan masalah
 *
 * Baru dicoba under Windows belum di Linux...
 * @author Rizky Gunawan<goeny_gon@yahoo.com>
 */


class pdfThumbnailer
{
    private $source;
    private $target;
    private $dimension;
    private $page;

    function  __construct() { }

    /**
     * Set PDF Source
     *
     * @param string $sourcePdfFilePath file path to PDF file
     */

    function setSource($sourcePdfFilePath)
    {
        if(file_exists($sourcePdfFilePath))
        {
            $this->source = $sourcePdfFilePath;
        }
        else
        {
            echo "pdf source File not found";
            return false;
        }
    }

    /**
     * Set target/result File with path.
     *
     * @param string $targetFilePath File result path
     */

    function setTarget($targetFilePath)
    {
        $this->target = $targetFilePath;
    }

    /**
     * Set Result With & height  if not supplied, it will set max to 500 pixel
     *
     * @param int $width width of thumbnail.
     * @param int $height height of thumbnail.
     */

    function setSize($width=500,$height='')
    {
        $this->dimension[0] = $width;
        $this->dimension[1] = $height;
    }

    /**
     * Set wich page you want to create, if not supplied, it will create all
     * page. Started from 0
     *
     * @param int $page Set wich page you want to create, start from 0
     */

    function setPage($page)
    {
        $this->page = $page;
    }

    /**
     * Generate the thumbnail.
     */

    function getThumbnail()
    {
        if($this->dimension[0]==0){ $this->dimension[0] = 500; }

        if($this->dimension[1]==''){$size = $this->dimension[0];}
        else{ $size = $this->dimension[0].'x'.$this->dimension[1];}

        if($this->page!='') { $page = "[".$this->page."]"; }

        if($this->source=='' || $this->target=='') { return false; die(); }

        $command = "convert -thumbnail ".$size." ".$this->source.$page." ".$this->target;
   
        $msg = popen($command,"r");            //Change shell_exec so it can works :D
        $read = trim(fread($msg, 2096));
       
   
        if($read == 'pdf source File not found')
        {
            return false;
        }
        else { return true; }
    }

}

?>

Simpan dengan nama “pdfThumbNailer.php”. Cara pakainya cukup simple:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>PDF Thumbnail Extractor Example</title>
    </head>
    <body>
        <?php
        /*
        IMAGENAGICK tidak dapat membaca path yang terdapat spasi, so just becarefull :)
        */

        require_once 'pdfThumbNailer.php'; //include file class
        $thumb = new pdfThumbnailer();
        $thumb->setSource(dirname(__FILE__).DIRECTORY_SEPARATOR.'exampleFile'.DIRECTORY_SEPARATOR.'test.pdf');
        $thumb->setTarget(dirname(__FILE__).DIRECTORY_SEPARATOR.'exampleFile'.DIRECTORY_SEPARATOR.'ThumbnailExtract.jpg');
       
        $thumb->setSize(500);
        $thumb->setPage("0");       //halaman dimulai dari nol. halaman nol, buat menjadi string.
        if($thumb->getThumbnail())
        {
                ?>
                <img src="exampleFile/ThumbnailExtract.jpg" />
                <?php
        }
        else
        {
                echo "Extraction failed";
        }
       
       
        ?>
    </body>
</html>

Sementara di beberapa PC converter tidak berjalan mulus karena terkadang Imagemagick tidak menemukan Ghostscript. Untuk mengatasinya bisa copykan file “gswin32c.exe”(yang ada di “gs\bin”) ke tempat class ini di eksekusi.

Untuk paket lengkapnya bisa di download disini

Popularity: 1% [?]

 

12 Responses to Making PDF Thumbnail From PHP Using Imagemagick and Ghostscript

  1. nazibana says:

    misi gan….
    ada contoh yang udah jadinya gag ??
    kya demonya gitu….

  2. リズキ says:

    Kalo Demo ga ada sih, soalnya web hosting gw ga ngijinin ini(entah di hosting gw ada Gs-nya atau enggak).

    Yang penting untuk bisa pake class ini harus ada Imagemagick dan juga Ghostscript. Imagicknya ga usah pakeextension PHP-nya karena dari PHP akan memanggil langsung melalui Shell command.

  3. dewo says:

    wah bagus mas scriptnya cuma saya mau tanya kok kalo background pdf nya warna putih jadinya jpg nya bground hitam .. banyak yg seperti itu ,.. apa ada fungsi untuk memperbaiki kualitas gambar yang di extrak misal jadi 256 color atau 8bit .. biar lebih bagus ..

    Terimakasih

  4. リズキ says:

    Setelah hari ini gw coba, saya menemukan masalahnya, sepertinya untuk rilis imagemagick terakhir ada opsi tambahan, gw mendowngrade dengan versi lebih tua(6.6.2-1 [ImageMagick-6.6.2-1-Q16-windows-dll.exe]) hasilnya lancar :)
    wah, saya baru tau ada kejadian seperti itu, sejauh ini di program yang saya buat ga pernah mengalami hal seperti itu

  5. cindy says:

    mantap gan…ane coba n berhasil…hehe..
    tapi bagaimana caranya jika ada banyak pdf gan…
    jadi maksudnya satu halaman banyak pdf yg di thumbnail…
    mohon pencerahannya master… :D

  6. リズキ says:

    1 halaman banyak PDF? atau 1 PDF banyak halaman?????

  7. cindy says:

    maksudnya 1 halaman banyak PDF…. :d:d
    sama kalau pdf thumbnail dari url gimana mas caranya…
    maap banyak nanya :d

  8. リズキ says:

    Kalo 1 file image banyak thumbnail PDF mah sama aja harus ngeextract semua halaman PDF terus tinggal di kalkulasiin dan cetak gambarnya dengan GDLIB etc… untuk logikanya sih bisa dipikirin sendiri, gw ga ada codenya(karena IMO menurut gw kalo PDF-nya masih beberapa halaman<10 mungkin readable, tapi kalo udha 20 halaman lebih jadinya dalam gambar kecil2, ga bisa dibaca)

    Kalo dari URL... copy dulu filenya ke lokal. Bisa degan function "copy" dari PHP(kalo fwraper mengiinkan), atau dengan CURL untuk copy filenya(bisa cari cara menggunakan CURL untuk mengcopy file dari URL lawan). Kalau langsung belom pernah coba:d

  9. cindy says:

    hehe :d mantap mas penjelasannya…
    tp yang ane maksud itu gini lho mas, jadi saya tampilkan thumbnail dari pdf yang berasal dari url… :d

    muter2 cari di simbah google dapet ini mas http://view.samurajdata.se/ tapi masih binggung untuk tampilin thumbnailnya aja…

    misal url pdfnya : http://www.yuma.usmc.mil/socialmedia/facebook_tutorial_handbook.pdf
    ane coba dapet proses seperti ini mas : http://view.samurajdata.se/ps.php?url=http%3A%2F%2Fwww.yuma.usmc.mil%2Fsocialmedia%2Ffacebook_tutorial_handbook.pdf&submit=View%21

    jadi kira2 kalo satu halaman ada beberapa pdf untuk di thumbnail caranya gimana ? :d:d

    maacih :”>

  10. リズキ says:

    gw mencoba langsung via URL bisa, tetapi sedikit perubahan di class “pdfThumbnailer”.

    Pada method “setSource”, yang isinya:
    if(file_exists($sourcePdfFilePath))
    {
    $this->source = $sourcePdfFilePath;
    }
    else
    {
    echo “pdf source File not found”;
    return false;
    }

    ganti dengan:
    $this->source = $sourcePdfFilePath;

    Tetapi pastikan si imagemagick bisa terkoneksi ke internet. Kalau ga bisa ya berarti harus dicopy ke lokal dulu file pdfnya(cari tutorial mengcopy dari remote server ke local server. biasanya menggunakan CURL).

    Untuk buat thumbnail yang berasal dari beberapa PDF gw ga punya caranya dan gw belom mikirin caranya.

  11. cindy says:

    gw coba kok gak ada bedanya ya mas ??

    ini saya coba disini http://hppy.in/pdfThumbnail/
    hasilnya “pdf source File not foundExtraction failed”
    saya coba2 edit disininya
    $thumb->setSource(‘http://www.yuma.usmc.mil/socialmedia/facebook_tutorial_handbook.pdf‘);

  12. cindy says:

    :d udah gan udah bisa dari url ternyata…hehe…
    tapi masih binggung untuk tampilin dari banyak link pdf gimana ya caranya ?? :d:d

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>