在说之前,先说明一下,FPDI 插件,不能操作被 pdf 软件编辑过的 pdf 文件。
在我们写项目的时候,经常需要对PDF文件进行操作。例如:合并多个PDF文件,取PDF特定页数以及合并。
PHP 有一个专门对PDF进行操作的插件,SETASIGN,官方文档为:
https://www.setasign.com/products/fpdi/demos/simple-demo/
首先,我们要先下载,该插件支持composer下载,具体的操作步骤,请看文档下载:
https://packagist.org/packages/setasign/fpdi
下面实现这些功能,上代码:
实现选取多个PDF文件的特定页数,进行合并
<?php
use setasign\Fpdi\Tcpdf\Fpdi;
//选取多个PDF,取第一页导出新的PDF
function selectionFirstPageToNewPdf($pdf_road_datas){
$pdf = new Fpdi();
// 載入現在 PDF 檔案
for($i = 0; $i < count($pdf_road_datas); $i++){
$pdf->setSourceFile($pdf_road_datas[$i]); //该方法的返回值为,PDF总页数
$tpl = $pdf->importPage(1); //取出PDF第一页
$pdf->addPage(); //添加到新的PDF上
$pdf->useTemplate($tpl); // 在新增的頁面上使用匯入的第一頁
// 輸出成本地端 PDF 檔案
}
/**
* 默认是I:在浏览器中打开,D:下载,F:在服务器生成pdf
* S:只返回pdf的字符串,个人感觉无实在意义
*/
$pdf->output("merge-articals.pdf", "D");
// 結束 FPDI 剖析器
$pdf->closeParsers();
return;
}
实现选取多个PDF文件进行合并:
<?php
use setasign\Fpdi\Tcpdf\Fpdi;
//拼接多个PDF
function selectionSplicingToNewPdf($pdf_road_datas){
// 建立 FPDI 物件
$pdf = new Fpdi();
// 載入現在 PDF 檔案
for($i = 0; $i < count($pdf_road_datas); $i++){
$page_count = $pdf->setSourceFile($pdf_road_datas[$i]);
for($pageNo = 1; $pageNo <= $page_count; $pageNo++){
//一页一页的读取PDF,添加到新的PDF
$templateId = $pdf->importPage($pageNo);
$size = $pdf->getTemplateSize($templateId);
$pdf->AddPage($size['orientation'], $size);
$pdf->useTemplate($templateId);
$pdf->SetFont('Helvetica');
$pdf->SetXY(5, 5);
}
}
$pdf->output("merge-pdf.pdf", "D");
// 結束 FPDI 剖析器
$pdf->closeParsers();
return ;
}
SETASIGN,这个PHP插件还有很多功能,具体的后续学习,可以看看官方文档。