php批量打印发票三(php用FPDF合并所有图片为PDF文档)
三. 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 setasignFpdiFpdi; 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; } }