PHP - 如何使用mPDF合并PDF

cva*_*man 7 php merge pdf-generation mpdf

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

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

mPDF error: Cannot open '/downloads/test.pdf'.
Run Code Online (Sandbox Code Playgroud)

上面的消息含糊不清,为什么它无法打开文件...这里是我用来尝试合并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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:将http://example.com/pdf/example.pdf中的mPDF错误更改为"/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;
Run Code Online (Sandbox Code Playgroud)

Vac*_*aci 10

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

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

function mergePDFFiles(Array $filenames, $outFile)
{
    if ($filenames) {

        $filesTotal = sizeof($filenames);
        $fileNumber = 1;

        $this->SetImportUse(); // this line comment out if method doesnt exist

        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); // in mPdf v8 should be 'importPage($i)'
                    $this->UseTemplate($tplId);
                    if (($fileNumber < $filesTotal) || ($i != $pagesInFile)) {
                        $this->WriteHTML('<pagebreak />');
                    }
                }
            }
            $fileNumber++;
        }

        $this->Output($outFile);

    }

}
Run Code Online (Sandbox Code Playgroud)


kru*_*hal 5

此代码适用于带有 php 7.4 的 mpdf 8.0.7。

              Mfiles = array();

             //Multiple pdf store in Mfiles array with full path.               
             array_push($Mfiles,'/assets/'.$pdfname.'.pdf');

                            
             $Mpath = 'Give file path with have you need to merge all pdf';

             // after loop we start this code
              if($Mfiles) 
                {
                  $filesTotal = sizeof($Mfiles);
                  $fileNumber = 1;
                  
                  if (!file_exists($Mpath)) 
                  {
                      $handle = fopen($Mpath, 'w');
                      fclose($handle);
                  }
                  foreach ($Mfiles as $fileName) 
                  {
                    if (file_exists($fileName)) 
                    {
                      $pagesInFile = $pdf->SetSourceFile($fileName);
                      for ($i = 1; $i <= $pagesInFile; $i++) 
                      {
                        $tplId = $pdf->importPage($i);
                        $pdf->UseTemplate($tplId);
                        if (($fileNumber < $filesTotal) || ($i != $pagesInFile)) 
                        {
                            $pdf->WriteHTML('<pagebreak />');
                        }
                      }
                    }
                    $fileNumber++;
                  }
                  $pdf->Output($Mpath);
                }
Run Code Online (Sandbox Code Playgroud)