PHP实现多页A6尺寸PDF拼版合并为A4PDF的方法及示例代码
A6尺寸PDF拼版为A4尺寸的实现方案
无需Composer依赖的方案
优先选择调用系统原生Ghostscript工具实现,不需要安装任何PHP依赖包,处理性能远高于PHP原生库,适合大体积PDF、高并发场景。绝大多数Linux服务器环境可直接通过包管理器安装Ghostscript,Windows环境仅需将Ghostscript二进制文件加入系统路径即可调用。
可选用的Composer依赖包
如果服务器权限受限无法安装系统工具,可选用以下开源MIT协议的Composer包实现,无商业使用限制:
setasign/fpdi:生态最成熟的PDF导入处理库,支持读取任意现有PDF页面,按自定义坐标摆放到新PDF页面,是PHP场景下PDF拼版的首选setasign/fpdf:轻量级PDF生成库,和FPDI搭配使用即可完成完整拼版逻辑,整体包体积不足1MB,加载速度快tecnickcom/tcpdf:功能全面的老牌PDF处理库,自带页面尺寸适配、内容排版能力,不需要额外搭配其他库即可完成拼版
可参考实现代码
无Composer依赖(Ghostscript实现)
<?php // 原A6 PDF文件路径 $sourcePdfPath = __DIR__ . '/a6_source.pdf'; // 拼版后输出A4 PDF路径 $outputPdfPath = __DIR__ . '/a4_merged.pdf'; // 读取原PDF总页数 $totalPage = (int)shell_exec( "gs -q -dNODISPLAY -c \"($sourcePdfPath) (r) file runpdfbegin pdfpagecount = quit\"" ); // 直接调用Ghostscript执行2*2排版拼版 $command = <<<GS_CMD gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER \ -sPAPERSIZE=a4 \ -dFIXEDMEDIA \ -sOutputFile={$outputPdfPath} \ -c " << /EndPage { 2 eq { pop false } { 4 mod 0 eq { /y 0 def /x 0 def } if 4 mod 1 eq { /y 421 def /x 0 def } if 4 mod 2 eq { /y 0 def /x 298 def } if 4 mod 3 eq { /y 421 def /x 298 def } if 0 0 moveto /curPage save def x y translate 0.707 0.707 scale curPage restore showpage true } ifelse } bind >> setpagedevice " -f {$sourcePdfPath} GS_CMD; shell_exec($command); echo "拼版完成,共生成".ceil($totalPage/4)."页A4文件,保存路径:{$outputPdfPath}"; ?>
Composer依赖实现(FPDI+FPDF)
先执行安装命令:composer require setasign/fpdi setasign/fpdf
对应代码:
<?php require __DIR__ . '/vendor/autoload.php'; use setasign\Fpdi\Fpdi; // 初始化A4尺寸PDF实例,单位毫米,关闭自动分页 $pdf = new Fpdi('P', 'mm', 'A4'); $pdf->SetAutoPageBreak(false); $sourcePdfPath = __DIR__ . '/a6_source.pdf'; $totalPage = $pdf->setSourceFile($sourcePdfPath); // A4页面2*2排版的四个A6区块坐标,A6标准尺寸为105mm*148mm $positions = [ ['x' => 0, 'y' => 0], ['x' => 0, 'y' => 148], ['x' => 105, 'y' => 0], ['x' => 105, 'y' => 148] ]; for ($pageNo = 1; $pageNo <= $totalPage; $pageNo++) { // 每4个A6页新建1个A4页 if (($pageNo - 1) % 4 === 0) { $pdf->AddPage(); } // 导入当前A6页面模板 $pageTpl = $pdf->importPage($pageNo); $currentPos = $positions[($pageNo - 1) % 4]; // 将A6页面放到对应位置,按原尺寸渲染不需要缩放 $pdf->useTemplate($pageTpl, $currentPos['x'], $currentPos['y'], 105, 148); } $pdf->Output(__DIR__ . '/a4_merged.pdf', 'F'); echo "拼版完成,共生成".ceil($totalPage/4)."页A4文件"; ?>
说明:以上代码完全匹配需求逻辑,例如7页A6内容会自动生成2页A4,第一页排版前4页A6内容,第二页排版剩余3页内容,空余位置自动留空。如果原PDF存在页面旋转、出血位等特殊设置,对应调整坐标参数即可。
内容的提问来源于stack exchange,提问作者bot studio
相关产品推荐
相关产品推荐

