使用Imagick将每个PDF页面保存为图像

16

我有下面这个 PHP 函数,可以将本地的 PDF 文件转换成图片。简单来说,我希望每一页 PDF 都能转换成单独的一张图片。

该函数将 PDF 转换为图片 - 但仅是最后一页。我希望每一页的 PDF 都被转换为图像并编号。而不仅仅是 PDF 的最后一页。

目前,此函数将example.pdf最后一页转换为example-0.jpg。我确定问题在于for方法中。我错过了什么?

$file_name = 'example.pdf'; // using just for this example, I pull $file_name from another function

function _create_preview_images($file_name) {

    // Strip document extension
    $file_name = basename($file_name, '.pdf');

    // Convert this document
    // Each page to single image
    $img = new imagick('uploads/'.$file_name.'.pdf');

    // Set background color and flatten
    // Prevents black background on objects with transparency
    $img->setImageBackgroundColor('white');
    $img = $img->flattenImages();

    // Set image resolution
    // Determine num of pages
    $img->setResolution(300,300);
    $num_pages = $img->getNumberImages();

    // Compress Image Quality
    $img->setImageCompressionQuality(100);

    // Convert PDF pages to images
    for($i = 0;$i < $num_pages; $i++) {         

        // Set iterator postion
        $img->setIteratorIndex($i);

        // Set image format
        $img->setImageFormat('jpeg');

        // Write Images to temp 'upload' folder     
        $img->writeImage('uploads/'.$file_name.'-'.$i.'.jpg');
    }

    $img->destroy();
}

我不知道是否有什么改变,但是上一次我生成PDF缩略图时使用的是$img = new imagick('file.pdf[0]');来获取第一页。 - dev-null-dweller
是的……我知道那个。但我不想要第一页、中间页或最后一页——我想把所有页面都转换成单张图片。 - Mike Barwick
我知道,我的意思是PDF作为其他多图像格式不太好用,所以你可能需要获取页面数量,在循环中创建新的imagick实例,并将“[$i]”附加到文件名。 - dev-null-dweller
你看了所有的代码吗...那正是我想做的... - Mike Barwick
1
这种方法无法处理多页PDF。$img->flattenImages();将所有页面合并在一起,并将文件导出为单个图像,而不管页面数量如何。有关具有黑色背景的多页PDF的解决方案,请参见https://dev59.com/_oTca4cB1Zd3GeqPBfbb。 - MarcinWolny
4个回答

12

看起来我的大部分代码都是正确的。问题在于,我错误地使用了$img->flattenImages();。这个函数将一系列图像合并为一张图像。就像在导出jpg时Photoshop将所有可见图层压平成一张图像。

我删除了上面的那一行代码,然后单独的文件按预期被写入。


我不明白这行代码 $img = new imagick('uploads/'.$file_name.'.pdf'); - 你肯定是要传入文件名,然后将其传递给构造函数吧?如果你的文件名没有路径,并且在上传目录中,我可以看出它可能会起作用。无论如何,如果对其他人有帮助的话,我用 $img = new imagick(); 替换了该行代码。$img->readImage($file_name);(在调用basename截取扩展名之前)。 - DJDave

6
 /* convert pdf file to list  image files */
                if($_FILES['file_any']['type']=='application/pdf'){
                    $file_name = str_replace(substr($url,0,strpos($url,$_FILES['file_any']['name'])),'',$url);
                    $basename = substr($file_name,0,strpos($file_name,'.'));
                    $abcd = wp_upload_dir();
                    $delpath = $abcd['path'];
                    $savepath = $abcd['url'];
                    $dirpath = substr($savepath,(strpos($savepath,'/upl')+1));

                    $file_name = basename($file_name, '.pdf');
                    $img = new imagick($delpath.'/'.$file_name.'.pdf');

                    $img->setImageBackgroundColor('white');
                    $img->setResolution(300,300);
                    $num_pages = $img->getNumberImages();
                    $img->setImageCompressionQuality(100);
                    $imageurl = NULL;
                    $imagedelurl = NULL;
                    for($i = 0;$i < $num_pages; $i++) {         
                        $imageurl[]=$savepath.'/'.$basename.'-'.$i.'.jpg';
                        $imagedelurl[] = $delpath.'/'.$basename.'-'.$i.'.jpg';
                        // Set iterator postion
                        $img->setIteratorIndex($i);

                        // Set image format
                        $img->setImageFormat('jpeg');

                        // Write Images to temp 'upload' folder     
                        $img->writeImage($delpath.'/'.$file_name.'-'.$i.'.jpg');
                    }
                    $img->destroy();
                }

3

不需要循环,有更简单的方法:只需使用$img->writeImages($filename,false)即可,它将为每个PDF页面创建一个文件。正如你所说,如果你先flatten图像,它只会保存一页。


1

首先在您的系统或服务器上安装

ImageMagick

,然后创建

pdfimage

文件夹并将PDF文件放入此文件夹中,然后运行代码并上传文件。

<?php
    $file_name = $_FILES['pdfupload']['name']; // using just for this example, I pull $file_name from another function
    //echo strpos($file_name,'.pdf');
    $basename = substr($file_name,0,strpos($file_name,'.'));
    //echo $_FILES['pdfupload']['type'];
    //if (isset($_POST['submit'])){
    if($_FILES['pdfupload']['type']=='application/pdf'){

        // Strip document extension
        $file_name = basename($file_name, '.pdf');
        // Convert this document
        // Each page to single image
        $img = new imagick('pdfimage/'.$file_name.'.pdf');

        // Set background color and flatten
        // Prevents black background on objects with transparency
        $img->setImageBackgroundColor('white');
        //$img = $img->flattenImages();

        // Set image resolution
        // Determine num of pages
        $img->setResolution(300,300);
        $num_pages = $img->getNumberImages();

        // Compress Image Quality
        $img->setImageCompressionQuality(100);
        $images = NULL;
        // Convert PDF pages to images
        for($i = 0;$i < $num_pages; $i++) {         
            $images[]=$basename.'-'.$i.'.jpg';
            // Set iterator postion
            $img->setIteratorIndex($i);

            // Set image format
            $img->setImageFormat('jpeg');

            // Write Images to temp 'upload' folder     
            $img->writeImage('pdfimage/'.$file_name.'-'.$i.'.jpg');
        }
        echo "<pre>";
        print_r($images);
        $img->destroy();
    }
    //}
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接