将多页pdf转换为jpg图像的最快方法

时间:2014-04-19 18:24:06

标签: php ghostscript imagick

我试图找到将多个pdf转换为jpeg图像的最快方法,而不会造成质量损失。我有以下代码:

    $this->imagick = new \Imagick();
    $this->imagick->setresolution(300,300);
    $this->imagick->readimage($this->uploadPath . '/original/test.pdf');
    $num_pages = $this->imagick->getNumberImages();

    for($i = 0;$i < $num_pages; $i++) {

        $this->imagick->setIteratorIndex($i);
        $this->imagick->setImageFormat('jpeg');
        $this->imagick->readimage($asset);

        // i need the width, height and filename of each image to add
        // to the DB
        $origWidth = $this->imagick->getImageWidth();
        $origHeight = $this->imagick->getImageHeight();
        $filename = $this->imagick->getImageFilename();


        $this->imagick->writeImage($this->uploadPath . '/large/preview-' . $this->imagick->getIteratorIndex() . '.jpg');

        $this->imagick->scaleImage($origWidth / 2, $origHeight / 2);
        $this->imagick->writeImage($this->uploadPath . '/normal/preview-' . $this->imagick->getIteratorIndex() . '.jpg');

        //add asset to the DB with the given width, height and filename ...
     }

这是非常缓慢的,部分是因为分辨率太大但是我没有添加它,图像上的文字质量非常差。此外,我首先保存图像,然后还保存较小版本的文件的事实可能不是很优化。

那么有没有人有更好的方法呢?也许只有ghostscript?

最低要求是我需要2个版本的转换图像。实际尺寸版本和半尺寸版本。我需要将宽度,高度和文件名添加到数据库中。

1 个答案:

答案 0 :(得分:1)

你可以使用Ghostscript,如果你设置“-sDEVICE = jpeg -sOutputFile = out%d.jpg”,那么每个页面都会被写入一个单独的文件。

请注意,由于JPEG是一种有损压缩方法,因此无法将PDF格式化为JPEG而没有质量损失。您是否考虑过使用无损格式,例如PNG或TIFF?

要获得不同大小的相同图像,您需要以不同的分辨率渲染文件两次,在Ghostscript中使用'-r'设置分辨率。可以从图像文件中轻松读取宽度和高度,也可以使用pdf_info.ps获取每个页面大小。请注意,PDF文件可以包含多个不同大小的页面,我希望您不要期望它们都是相同的....