三. php用FPDF合並所有圖片為PDF文檔
過程
1.下載FPDF庫, F意為free,免費的意思. 但它調用fpdi時, 有區分免費和商業版本. 所以起初想用FPDF和FPDI庫, 進行PDF合並, 結果發現發票的PDF是修改過了,加了簽章,免費版的合並不了,只能用商業版, 所以放棄了, 如果是普通PDF, 還是很方便快捷
方法1: 把圖片合並成1個PDF文檔
將前生成圖片后,所有的圖片名+路徑以數組方式傳入該函數, 循環添加PDF頁面, 如果遇到橫向圖片(帶_p),新增頁時就加上參數: p, 還有當前頁畫布的高寬值做交換
//開始合並生成PDF if(!empty($backPath)) { include_once 'myProject/functions/fpdf/fpdf.php'; $pdf=new FPDF('L','mm',['405.7','268.1']); //定義一個PDF文檔 foreach ($backPath as $item) { if(is_file($item)) { if(strpos($item, '_p.png')) //如果是橫向,就要改變寫入圖片的寬高 { $pdf->AddPage('p'); $pdf->Image($item,0,0,268.1,405.7); } else { $pdf->AddPage(); $pdf->Image($item,0,0,0,0); } } else { echo ("<script>alert('圖片文件不存在');window.close();</script>"); exit; } } $pdf->Output(); //輸出PDF文件 }
方法2: 把多個PDF合並成1個PDF文檔
前題: PDF沒修改過
引入FPDF和FPDI, 代碼如下, 這個從官方文檔看, 示例代碼很多. 復制來就能用
//PDF文檔合並,功能正常, 不能合並編輯過的PDF,比如有簽名的,比如蓋章的發票. use setasign\Fpdi\Fpdi; require_once('fpdf/fpdf.php'); require_once('fpdi/src/autoload.php'); class ConcatPdf extends Fpdi { public $files = array(); public function setFiles($files) { $this->files = $files; } public function concat() { foreach($this->files AS $file) { $pageCount = $this->setSourceFile($file); for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) { $pageId = $this->ImportPage($pageNo); $s = $this->getTemplatesize($pageId); $this->AddPage($s['orientation'], $s); $this->useImportedPage($pageId); } } } } $pdf = new ConcatPdf(); $pdf->setFiles(array('5.pdf', '6.pdf')); $pdf->concat(); $pdf->Output('I', 'concat.pdf');
小記:
如果10多張發票一起處理, 可能會超過1分鍾,這時會引起WEB服務響應超時.
環境是phpstudy
經測試,Apache默認是40秒, nginx為60秒.
修改apache中的配制后,不生效找不到原因. 就換nginx了. Nginx需要修改配制如下:
把所有timeout都改成了600, 意為10分鍾. 其實在小皮面板的配制里也可以改, 但改了還是不夠的.
找到send_timeout項, 在下面接着加上如下三項:
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
這樣就可以正常運行了, 最好在本地做測試. 由於我用了Nginx作了反向代理, 用的域名訪問, 還是超時.
然后在代理服務器上做了如下設置,即可解決.
#我的內網代理
server { listen 80; server_name abc.abc.com; location / { proxy_pass http://192.168.0.7; proxy_read_timeout 600; #1 增加如下兩項 proxy_send_timeout 600; #2 root html; index index.html index.htm; } }