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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM