【问题标题】:Generating mutliple pdf files using mpdf but only one is generated使用 mpdf 生成多个 pdf 文件但只生成一个
【发布时间】:2021-02-28 18:41:45
【问题描述】:

我想使用mpdf库生成多个文件,可惜只生成了一个文件,而不是多个,我该怎么做。感谢您的关注。

for ($i=1; $i<count($sheetData); $i++)
 {
  $name = $sheetData[$i][0];
  $fName = $sheetData[$i][1];
                      
  $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => [290, 236]]);
  $stylesheet = file_get_contents('../assets/css/style.css');
  $mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
  ob_end_clean();
                       
  $html = $mpdf->WriteHTML('<p>My Layout is there</p>');
  $filename = time().'.pdf';
  $mpdf->Output($filename ,'D');
  unset($mpdf);
}

【问题讨论】:

    标签: php loops mpdf


    【解决方案1】:

    您需要保存它们。你不能用“D”或“I”一次输出它们

    $mpdf->Output($filename ,'F');
    

    如果需要一个带有 addPage() 的文件 https://mpdf.github.io/reference/mpdf-functions/addpage.html

    $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => [290, 236]]);
    
    for ($i = 1; $i < count($sheetData); $i++) {
        $name = $sheetData[$i][0];
        $fName = $sheetData[$i][1];
    
        $stylesheet = file_get_contents('../assets/css/style.css');
    
        if ($i > 1) {
            $mpdf->AddPage();
        }
        $mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
        $mpdf->WriteHTML('<p>My Layout is there</p>');
    
    
    }
    
    $filename = 'my.pdf';
    $mpdf->Output($filename, 'F');
    

    你也可以先创建html

    $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => [290, 236]]);
    $html = '';
    for ($i = 1; $i < count($sheetData); $i++) {
        $name = $sheetData[$i][0];
        $fName = $sheetData[$i][1];
        
        $html .=  '<p>My Layout is there</p>';
        
    }
    
    $stylesheet = file_get_contents('../assets/css/style.css');
    
    $mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
    $mpdf->WriteHTML($html);
    $filename = 'my.pdf';
    $mpdf->Output($filename, 'D');
    

    【讨论】:

    • 将 d 更改为 f 但会引发错误。注意:ob_end_clean():删除缓冲区失败。没有要删除的缓冲区
    • 删除 ob_end_clean() 应该不是问题
    • 你解决了我的问题,现在生成了多个文件,但我想将它们保存到单个文件中,而不是单独保存
    • 我已经编辑了创建一个文件的答案
    • 仍然,它正在生成多个文件
    【解决方案2】:

    您想向客户端发送多个 PDF 文件还是将它们保存在磁盘上?

    您使用time() 作为伪随机文件名,但如果 PDF 文件的生成速度足够快并且发生在同一秒内,您将覆盖先前生成的文件,至少如果您选择存储生成的文件在磁盘上。您可能想要使用 "generated_$i" 之类的东西,而不是 time()

    【讨论】:

    • 是的,我想将它们本地保存在我的电脑上。
    • 在这种情况下,您需要将“D”更改为“F”,如@Delete 的评论中所述,并将time() 更改为更好的值。
    • 我随时间添加了 rand 键,因此没有机会覆盖相同的文件名。 ~~~$key = rand(1,10000); $filename = $key.''.time().'.pdf';~~~
    • @HadiNiazi 您还可以使用hrtime(true),而不是rand() + time() 连接。您还可以从中截断哈希以确保长度始终是固定的:substr(hash('sha256', hrtime(true)), 0, 12);
    • 好主意,我会试试这个,你能建议我如何解决生成文件的多个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2014-05-12
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多