php8 实现图片和pdf文件相互转换

php8 结合 imagick 3.7 实现图片和pdf文件相互转换

多个图片合并成为一个图片

function margeImages($images, $outputPath)

将一个PDF文件转换为一张长图 或者多个图片

function pdf2img($pdfPath, $outputPath, $imageType = 'jpg', $toMulti = false)

多个图片合并生成一个pdf文件

function img2pdf($imagePaths, $outputPath)

多个pdf文件合并成一个pdf文件

function mult_pdf2pdf($pdfFiles, $outputPath)

完整代码

<?php

// 引入 Imagick 扩展  
if (!extension_loaded('imagick')) {
    die('Imagick扩展未加载');
}

// 文档 https://www.php.net/imagick
//文档 https://phpimagick.com/Imagick/appendImages

use Imagick;

$pdfPath    = '/data/zxf/test.pdf'; // 要转换的PDF文件路径(替换为你的实际文件路径)
$outputPath = '/data/zxf/temp/output.jpg'; // 转换后的JPG文件输出路径(替换为你的实际文件路径)


$images = [
    "/data/zxf/temp/test_0.png",
    "/data/zxf/temp/test_1.png",
];

// 合并图片,多个图片合并成一张图片
function margeImages($images, $outputPath)
{
    $canvas = new Imagick();

    foreach ($images as $imageRow) {
        $rowImagick = new Imagick(realpath($imageRow));
        $rowImagick->setImageBackgroundColor("gray");
        // 设置图像大小
        $rowImagick->resizeimage(500, 500, \Imagick::FILTER_LANCZOS, 1.0, true);
        $canvas->addImage($rowImagick);
    }

    $canvas->resetIterator();

    // true:纵向合并图片;false 横向合并图片
    $finalimage = $canvas->appendImages(true);
    $finalimage->setImageFormat('jpg');
    // 将最终图像保存为JPG文件
    $finalimage->writeImage($outputPath);
    // 浏览器输出图片
    //  header("Content-Type: image/jpeg");
    // echo $finalimage->getImageBlob();

    // 清理资源,释放资源
    $canvas->destroy();
    $finalimage->destroy();
}

margeImages($images, $outputPath = '/data/zxf/temp/multiple_img_to_one_img.jpg');


// 将PDF转换为一张长图 或者多个图片
function pdf2img($pdfPath, $outputPath, $imageType = 'jpg', $toMulti = false)
{
    $pdf       = new Imagick($pdfPath);
    $pageCount = $pdf->getNumberImages();
    $pdf->setImageFormat($imageType);

    if ($toMulti) {
        for ($i = 0; $i < $pageCount; $i++) {
            $pdf->setIteratorIndex($i);
            $pdf->writeImage($outputPath . '_' . $i . '.' . $imageType);
        }
    } else {
        $pdf->resetIterator();
        // true:纵向合并图片;false 横向合并图片
        $finalimage = $pdf->appendImages(true);
        $finalimage->setImageFormat('jpg');
        // 将最终图像保存为JPG文件
        $finalimage->writeImage($outputPath);
        // 浏览器输出图片
        //  header("Content-Type: image/jpeg");
        // echo $finalimage->getImageBlob();

        $finalimage->destroy();
    }
    // 清理资源,释放资源
    $pdf->destroy();


}

pdf2img($pdfPath, $outputPath = '/data/zxf/temp/pdf_to_one_img.jpg', 'jpg', false);


function img2pdf($imagePaths, $outputPath)
{
    // 创建一个新的 Imagick 对象
    $pdf = new Imagick();

    foreach ($imagePaths as $path) {
        $image = new Imagick($path);
        $pdf->addImage($image);
    }

    // 将所有图片合并为一个 PDF 文件
    $pdf->setImageFormat('pdf');
    // $pdf->saveImage($outputPath); // 保存为 PDF 文件
    // 保存合并后的 PDF 文件
    $pdf->writeImages($outputPath, true);

    // 清理资源
    $pdf->clear();
    $pdf->destroy();

}

img2pdf($images, $outputPath = '/data/zxf/temp/mult_img_to_pdf.pdf');

function mult_pdf2pdf($pdfFiles, $outputPath)
{
    // 多个PDF文件合并为一个PDF文件(放在一页内)
//    // 创建Imagick对象
//    $image = new Imagick();
//
//    // 逐个添加PDF文件到Imagick对象
//    foreach ($pdfFiles as $file) {
//        $image->readImage($file);
//    }
//
//    // 设置合并的PDF文件设置
//    $image->resetIterator();
//    $combinedPdf = $image->appendImages(true);
//
//    // 将合并后的PDF保存到新文件中
//    $combinedPdf->setImageFormat('pdf');
//    $combinedPdf->writeImages($outputPath, true);
//
//    // 清理Imagick对象
//    $image->clear();
//    $image->destroy();
// 多个PDF文件合并为一个PDF文件(放在一页内) end


    // 创建ImageMagick对象
    $imagick = new Imagick();

    // 合并PDF文件
    foreach ($pdfFiles as $pdfFile) {
        $imagick->readImage($pdfFile);
    }

    // 设置PDF输出选项
    $imagick->setImageFormat('pdf');

    // 合并PDF文件并保存
    $imagick->writeImages($outputPath, true);

    // 清理资源
    $imagick->clear();
    $imagick->destroy();
}

mult_pdf2pdf(['/data/zxf/test.pdf', '/data/zxf/t1.pdf'], $outputPath = '/data/zxf/temp/mult_pdf_to_one_pdf.pdf');

echo '完成!';