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; } }