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

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

phpmianshi2个月前 (07-09)php166

背景


市面上常见的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。


大家也可以用这个现在压缩的网站

https://www.ilovepdf.com/zh-cn/compress_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面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

php闭包的优缺点

闭包函数:临时创建一个没有名称的函数,经常作为回调函数来用。通俗的说就是:子函数可以使用父函数中的局部变量,这种行为叫做闭包。我的理解是: 闭包就是能够读取其他函数内部变量的函数。匿名函数赋...

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

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

php中Memcache::get(): Server...failed with: Failed reading line from stream

背景最近sentry报告PHP的memcache客户端php-memcache经常出 现断连接的问题:PHP Notice:  Memcache::get(): Server ………. (t...

PHP内核分析之GDB使用(一)

1.PHP源码下载和安装https://github.com/php/php-src/releases$ ./configure --prefix=/usr/local/php7&...

php8世界上最好的语言新版本特性

php8世界上最好的语言新版本特性

本文只会讲述新特性的一些关键点,更详细的介绍请认真阅读官方文档。01 Union Types(联合类型)说明一点,从 PHP 7 开始,支持下面这样的语法:function sum(int&...

理解PHP中的Generator

PHP中Generator,似乎是在5.5版中引入了。PHP中的协程必须依赖于Generator来实现,所以我觉得有必要先专门写一篇文章介绍Generator。Generator这个单词在这里对应的中...

发表评论

访客

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