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

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

phpmianshi3个月前 (07-09)php255

背景


市面上常见的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面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

composer autoload自动加载性能优化指南

简介composer 提供的 autoload 机制使得我们组织代码和引入新类库非常方便,但是也使项目的性能下降了不少 。composer autoload 慢的主要原因在于来自对 PSR-0 和 P...

PHP中跨域原理以及解决方案

1.为啥出现跨域在制定Html规则时,为了安全的考虑,一个源的脚本(网页,网站)不能与另一个源的资源进行交互,所以就引发一个词叫做“同源策略”。所谓同源(即指在同一个域),就是两个页面具有相同的协议(...

结构体对齐

书里给了一段代码,假如有个结构体如下:struct test {    char a;    int b;    long c; ...

记一次tp3.2.3因fetch导致的漏洞处理过程

记一次tp3.2.3因fetch导致的漏洞处理过程

问题描述:最近发现百度收录大幅度下降,并出现大量5xx错误,有些收录页面直接跳转到其他网站,如下图:问题追查1.根据以往经验首先怀疑网站被植入或者挂马      &nbs...

PHP内核分析之深入理解字符串(七)

一、字符串的结构struct _zend_string {     zend_refcounted_h gc; &nb...

phpfpm中status状态说明详解

背景phpfpm跟nginx一样有个status状态监控页。可能通过status状态监控页了解phpfpm的运行状态,如并发数,总进程数等。启用php-fpm状态功能# vim /...

发表评论

访客

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