Mpdf 不在移动设备上生成 PDF。在台式机上完美运行

Posted

技术标签:

【中文标题】Mpdf 不在移动设备上生成 PDF。在台式机上完美运行【英文标题】:MPdf not generating PDF on mobile devices. Works perfectly on desktops 【发布时间】:2019-09-02 12:27:16 【问题描述】:

我正在使用 8.0 版的 MPdf 和 php 7.1 版。 这是我的代码。

function generatePDF($order)
  $html = getHTML($order);
  try 
  $mpdf = new \Mpdf\Mpdf(['margin_left' => 20,
    'margin_right' => 15,
    'margin_top' => 48,
    'margin_bottom' => 25,
    'margin_header' => 10,
    'margin_footer' => 10]);
  $mpdf->SetProtection(array('print'));
  $mpdf->SetDisplayMode('fullpage');
  $mpdf->WriteHTML($html);
  $mpdf->Output('ABCD.pdf','I');
catch (\Mpdf\MpdfException $e)  // Note: safer fully qualified exception name used for catch
    // Process the exception, log, print etc.
    $error = $e->getMessage();
    echo $e->getMessage();

此代码非常适合桌面。如果我使用笔记本电脑或任何台式机,它可以很好地生成 PDF。但是,当我在移动设备上查看它时,它不会下载任何 PDF。它也不会抛出任何异常或错误。

我已经调试了每一行代码,每一行都按预期执行得很好,只是没有生成 PDF。

【问题讨论】:

一些移动浏览器对 PDF 有点挑剔。你用的是什么浏览器 谷歌浏览器,Firefox 移动版RiggsFolly,它只是无法在移动端运行。 尝试在您的手机上下载 Adob​​e Acrobat Reader 应用程序,看看是否可行。 【参考方案1】:

可以使用F 参数代替$mpdf->Output('ABCD.pdf','I'); 中的I 参数。有关更多信息,请参阅链接 here。 F参数在服务器的特定目录下创建文件没有任何问题,通常使用ID参数:$mpdf->Output('/DIRABCD.pdf','F');

之后,您可以使用 PHP 中的 readfile()fread() 函数强制浏览器(手机或 PC)下载文件。

代码是这样的:

function generatePDF($order)
  $html = getHTML($order);
  try 
  $mpdf = new \Mpdf\Mpdf(['margin_left' => 20,
    'margin_right' => 15,
    'margin_top' => 48,
    'margin_bottom' => 25,
    'margin_header' => 10,
    'margin_footer' => 10]);
  $mpdf->SetProtection(array('print'));
  $mpdf->SetDisplayMode('fullpage');
  $mpdf->WriteHTML($html);
  $mpdf->Output('/DIR/ABCD.pdf','F');
  
    ob_start();
    header("Content-type:application/pdf");
    header("Content-Disposition:attachment;ABCD.pdf");
    readfile("/DIR/ABCD.pdf");
    exit;
  
catch (\Mpdf\MpdfException $e)  // Note: safer fully qualified exception name used for catch
    // Process the exception, log, print etc.
    $error = $e->getMessage();
    echo $e->getMessage();

【讨论】:

【参考方案2】:

在将 HTML 写入 pdf 之前,请尝试清理缓冲区。这是您的更新代码。

function generatePDF($order)
    $html = getHTML($order);
    try 
        $mpdf = new \Mpdf\Mpdf(['margin_left' => 20,
        'margin_right' => 15,
        'margin_top' => 48,
        'margin_bottom' => 25,
        'margin_header' => 10,
        'margin_footer' => 10]);
        $mpdf->SetProtection(array('print'));
        $mpdf->SetDisplayMode('fullpage');
        
        ob_get_clean(); // Add this line before writing the HTML
        
        $mpdf->WriteHTML($html);
        $mpdf->Output('/DIR/ABCD.pdf','F');
    
        exit;
    
     catch (\Mpdf\MpdfException $e)  // Note: safer fully qualified exception name used for catch
      // Process the exception, log, print etc.
      $error = $e->getMessage();
      echo $e->getMessage();
    

【讨论】:

以上是关于Mpdf 不在移动设备上生成 PDF。在台式机上完美运行的主要内容,如果未能解决你的问题,请参考以下文章

移动设备和台式机上的引导卡大小不同

mPDF 仅在启用 progressBar 时“完成”

如何在台式机上调试 Android 的原生浏览器(不是 Chrome)?

使用 MPDF 发送 PDF 电子邮件

CSS媒体查询不足以检测超大型移动设备/平板电脑,而不是台式机[重复]

在 dompdf 的 newtab 上生成 pdf