首页 文章

PHP - 如何使用mPDF合并PDF

提问于
浏览
7

我将首先说我可以使用mPDF生成PDF文件,但对于我的生活,我无法将现有的PDF与它刚刚生成的PDF合并 .

我需要弄清楚的是如何将现有的PDF附加/添加到新生成的PDF中 . 我已经尝试使用mPDF方法导入页面,但我只能得到一个错误:

mPDF error: Cannot open '/downloads/test.pdf'.

上面的消息含糊不清,为什么它无法打开文件...这里是我用来尝试合并PDF的代码:

include_once("./pdf/mpdf/mpdf.php");

 $output_file = $_GET['output_file'];
 $url = $_GET['input_file'];
 $technical_drawing = $_GET['tech_drawing'];

 $html = file_get_contents($url);

 $mpdf = new mPDF('utf-8','Letter','','',0,0,0,0,0,0,'P');
 $mpdf->SetImportUse(); 

 $pagecount = $mpdf->SetSourceFile($technical_drawing);
 $tplIdx = $mpdf->ImportPage($pagecount);
 $mpdf->UseTemplate($tplIdx);

 $mpdf->WriteHTML($html);
 $mpdf->Output($output_file, 'D');

 exit;

$ output_file将是显示给用户的文件名 . $ url是我们在PDF生成期间写入文件的HTML . $ technical_drawing是我们想要附加/合并生成的PDF的PDF的相对路径 .

我知道我可以使用像ghostscript这样的东西,但我在客户端的服务器上没有这种访问类型 .

让我知道是否有人使用mPDF找到了解决方案,或者我是S.O.L.并需要找到另一个库来进行PDF合并 . 我真的在寻找解决方案或建议,但不只是寻找其他图书馆的链接 . 我已经厌倦了我在谷歌或mPDF的文档中找到的描述我所遇到的错误的文章 .

编辑:将mPDF错误从http://example.com/pdf/example.pdf更改为'/downloads/test.pdf' .

EDIT_2:代码已修复为采用相对路径 .

这是最终的工作代码 . 如果有人知道如何指定将HTML编写为PDF文档的顺序,将页面导入为最后一页(自定义页面大小与HTML的页面大小不同),则可获得奖励 .

include_once("./pdf/mpdf/mpdf.php");

    $output_file = 'test-' . $_GET['output_file'];
    $url = $_GET['input_file'];
    $technical_drawing = $_GET['tech_drawing'];

    $html = file_get_contents($url);


    if(!file_exists($technical_drawing)) {
      $mpdf = new mPDF('utf-8','Letter','','',0,0,0,0,0,0,'L');
    } else {
      $mpdf = new mPDF('utf-8','A3-L','','',0,0,0,0,0,0,'L');

      $mpdf->SetImportUse(); 

      $pagecount = $mpdf->SetSourceFile($technical_drawing);
      $import_page = $mpdf->ImportPage();

      $mpdf->UseTemplate($import_page);

      // Add Last page
      $mpdf->AddPageByArray(array(
        'orientation' => 'P',
        'ohvalue' => 1,
        'ehvalue' => -1,
        'ofvalue' => -1,
        'efvalue' => -1,
        'newformat' => 'Letter'
      ));
    }

    $mpdf->WriteHTML($html);
    $mpdf->Output($output_file, 'D');

    exit;

3 回答

  • 3

    我像这样合并pdf - {所有文件中的所有页面}:

    $ this =扩展mPDF类的类...

    function mergePDFFiles(Array $filenames, $outFile)
    {
        if ($filenames) {
    
            $filesTotal = sizeof($filenames);
            $fileNumber = 1;
    
            $this->SetImportUse();
    
            if (!file_exists($outFile)) {
                $handle = fopen($outFile, 'w');
                fclose($handle);
            }
    
            foreach ($filenames as $fileName) {
                if (file_exists($fileName)) {
                    $pagesInFile = $this->SetSourceFile($fileName);
                    for ($i = 1; $i <= $pagesInFile; $i++) {
                        $tplId = $this->ImportPage($i);
                        $this->UseTemplate($tplId);
                        if (($fileNumber < $filesTotal) || ($i != $pagesInFile)) {
                            $this->WriteHTML('<pagebreak />');
                        }
                    }
                }
                $fileNumber++;
            }
    
            $this->Output($outFile);
    
        }
    
    }
    
  • 0
    function mergePDFFiles(Array $filenames, $outFile) {
        $mpdf = new mPDF();
        if ($filenames) {
            //  print_r($filenames); die;
            $filesTotal = sizeof($filenames);
            $fileNumber = 1;
            $mpdf->SetImportUse();
            if (!file_exists($outFile)) {
                $handle = fopen($outFile, 'w');
                fclose($handle);
            }
            foreach ($filenames as $fileName) {
                if (file_exists($fileName)) {
                    $pagesInFile = $mpdf->SetSourceFile($fileName);
                    //print_r($fileName); die;
                    for ($i = 1; $i <= $pagesInFile; $i++) {
                        $tplId = $mpdf->ImportPage($i);
                        $mpdf->UseTemplate($tplId);
                        if (($fileNumber < $filesTotal) || ($i != $pagesInFile)) {
                            $mpdf->WriteHTML('<pagebreak />');
                        }
                    }
                }
                $fileNumber++;
            }
            $mpdf->Output($outFile, 'D');
        }
    }
    
  • 0

    这是一个老问题 . 在我将PDF合并为一个并在浏览器中显示之后,我登陆了这里 . 上面的两个答案由我测试,并没有按预期工作 . 第一个文件的第一页被正确显示,第二个文件的第一页跳过一个空白页,并被截获,即只显示N页的N-1页 . 最后一页丢失了 . 这是我在抓取到mpdf.php源代码后制作的解决方法:

    function mergePDFFiles(Array $filenames, $outFile, $title='', $author = '', $subject = '') {
            $mpdf=new mPDF('c');
            $mpdf->SetTitle($title);
            $mpdf->SetAuthor($author);
            $mpdf->SetSubject($subject);
            if ($filenames) {
                $filesTotal = sizeof($filenames);
                $mpdf->SetImportUse();        
                for ($i = 0; $i<count($filenames);$i++) {
                    $curFile = $filenames[$i];
                    if (file_exists($curFile)){
                        $pageCount = $mpdf->SetSourceFile($curFile);
                        for ($p = 1; $p <= $pageCount; $p++) {
                            $tplId = $mpdf->ImportPage($p);
                            $wh = $mpdf->getTemplateSize($tplId);                
                            if (($p==1)){
                                $mpdf->state = 0;
                                $mpdf->UseTemplate ($tplId);
                            }
                            else {
                                $mpdf->state = 1;
                                $mpdf->AddPage($wh['w']>$wh['h']?'L':'P');
                                $mpdf->UseTemplate($tplId);    
                            }
                        }
                    }                    
                }                
            }
            $mpdf->Output();
            unset($mpdf);
        }
    

    未使用 $outFile ,因为生成的PDF旨在强制使用浏览器 .

相关问题