当前位置:首页 > php > 正文内容

php中如何合并多个pdf并压缩

phpmianshi4周前 (07-09)php61

背景


市面上常见的pdf处理软件,大部分都是收费的,经常功能不全,有时我们需要合并多个pdf文件,有时甚至还需要压缩一下大小,我怎么能用PHP做到这一点呢?


解决方案

(一)利用linux命令gs、pdf2ps、ps2pdf等

<?php

$fileArray = array("name1.pdf", "name2.pdf", "name3.pdf", "name4.pdf");

$datadir = "/home/phpmianshi.com/pdf/";
$outputName = $datadir . "merged.pdf";

$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$outputName ";
//Add each pdf file to the end of the command
foreach ($fileArray as $file) {
    $cmd .= $file . " ";
}
$result = shell_exec($cmd);


通过将PDF转换为Postscript,然后使用

pdf2ps merged.pdf merged.ps

ps2pdf -dPDFSETTINGS=/ebook merged.ps merged-optimized.pdf


参数-dPDFSETTINGS的值定义了生成的PDF中图像的质量。 从低到高质量的选项有:/screen/default/ebook/printer/prepress

请参阅http://milan.kupcevic.net/ghostscript-ps-pdf/ 以供参考。

Postscript文件可能会变得很大,但结果值得。 我从60 MB的PDF转换为140 MB的Postscript文件,但最终得到了1.1 MB的优化PDF。

(二)需要fpdf和fpdi库,2个都要下载

FPDF:http://www.fpdf.org/en/download.php

GITHUB: https://github.com/Setasign/FPDF

FPDI:https://www.setasign.com/products/fpdi/downloads

参考案例:https://manuals.setasign.com/fpdi-manual/v2/the-fpdi-class/examples/#index-3

<?php

use \setasign\Fpdi\Fpdi;

require_once('/home/phpmianshi/fpdi/fpdf/fpdf.php');
require_once('/home/phpmianshi/fpdi/src/autoload.php');

$fileArray = array("name1.pdf", "name2.pdf", "name3.pdf", "name4.pdf");

$files = array(
    'name1.pdf',
    'name2.pdf',
    'name3.pdf'
);

// initiate FPDI
$pdf = new Fpdi();

// iterate through the files
foreach ($files as $file) {
    // get the page count
    $pageCount = $pdf->setSourceFile($file);
    // iterate through all pages
    for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
        // import a page
        $templateId = $pdf->importPage($pageNo);
        // get the size of the imported page
        $size = $pdf->getTemplateSize($templateId);

        // add a page with the same orientation and size
        $pdf->AddPage($size['orientation'], $size);

        // use the imported page
        $pdf->useTemplate($templateId);

        $pdf->SetFont('Helvetica');
        $pdf->SetXY(5, 5);
        //$pdf->Write(8, 'A simple concatenation demo with FPDI');
    }
}

// Output the new PDF
$pdf->Output("F", 'merged.pdf');

FPDF简介

FPDF 是一个 PHP 类,它允许用纯 PHP 生成 PDF 文件,也就是说,不需要使用PDFlib库。FPDF中的F代表免费:你可以将其用于任何类型的用途,并根据你的需要进行修改。

测量单位、页面格式和页边距的选择
页眉和页脚管理
自动分页
自动换行和文本调整
支持图像(JPEG、PNG和GIF)。
颜色
链接
支持TrueType、Type1和编码
页面压缩


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

a标签跨域下载文件,解决download失效问题

背景a标签中download属性可以更改下载文件的文件名。但是如果是跨域的话,download属性就会失效。解决方案一<a onclick="downloadFile(...

php5数组与php7数组区别

php5数组与php7数组区别

PHP5数组结构体typedef struct _hashtable {       uint n...

PHP对象使用数组形式访问成员变量

PHP中有很多接口类,不过平时都不会怎么用到.一般访问php类的变量都是使用类->变量名进行访问.除了这样还可以实现接口类用数组方式进行访问类["变量名"]需要实现的是Arr...

laravel中嵌套事务是如何实现的

关于mysql的事务嵌套关于mysql 的事务嵌套可以查看这个地址:https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html里面有这么一...

php中使用swoole加速lumen项目-laravelS实战

背景公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目https://github.com/hhxsv5/laravel-s下面...

lumen项目集成laravelS后sentry无法上报的问题

背景公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目laravelS github : https://github.com/...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。