在說之前,先說明一下,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插件還有很多功能,具體的後續學習,可以看看官方文檔。