• 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; } }
     
  • 相关阅读:
    linux串口驱动分析
    redis 源代码分析(一) 内存管理
    EJB3.0开发环境的搭建
    Google App Engine 学习和实践
    用EnableMenuItem不能使菜单变灰的原因
    hdu 1171 Big Event in HDU(母函数)
    Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)
    遗传算法入门到掌握(一)
    Amazon SQS简单介绍 上篇
    Matlab画图-非常具体,非常全面
  • 原文地址:https://www.cnblogs.com/apolloren/p/15008466.html
Copyright © 2020-2023  润新知