PHP - 如何使用mPDF合并PDF

时间:2014-10-16 21:34:50

标签: php merge pdf-generation mpdf

我首先要说的是,我可以使用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合并。我真的在寻找解决方案或建议,但不只是寻找其他图书馆的链接。我已经厌倦了我在Google或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;

4 个答案:

答案 0 :(得分: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);

    }

}

答案 1 :(得分:1)

此代码适用于mpdf 8.0.7和php 7.4。

List<Contact> tempContactList = List<Contact>();
contactList.forEach((contact) {
  if (contact.displayName != null){
    var searchName = val.replaceAll(new RegExp(r'[\u200f]'), "");
    if(contact.displayName.contains(searchName)){
      tempContactList.add(contact);
    }
  }
});

答案 2 :(得分: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');
    }
}

答案 3 :(得分: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旨在强制浏览器。