无法打开使用dompdf生成的PDF文件

4
我正在尝试使用dompdf从smarty模板生成pdf文件,代码如下:
require_once('dompdf/dompdf_config.inc.php');
$dompdf = new DOMPDF();
$dompdf->load_html($smarty->fetch(CURRENT_TEMPLATE.'/module/shopping_cart.html'));
$dompdf->render();
$dompdf->stream("sample.pdf");

生成了一个PDF文档,但是当我尝试打开PDF文档时,显示如下错误信息:

"Acrobat无法打开“sample.pdf”,因为要么不支持该文件类型,要么该文件已损坏"

当我尝试关闭HTML页面时,它能够正确地显示。

echo $smarty->fetch(CURRENT_TEMPLATE.'/module/shopping_cart.html')

所以请帮我解决这个错误...提前感谢。


1
使用stream()而不破坏文件,请参见AntonAL的建议。这是您问题的正确答案; - ripat
5个回答

27
在调用$dompdf->stream();之前,请使用ob_end_clean();
此函数会丢弃最顶层的输出缓冲区内容,并关闭该输出缓冲区。如果您想进一步处理缓冲区内容,则必须在调用ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时,缓冲区内容将被丢弃。 PHP 手册 ob_end_clean

3
应该被选择为答案。 - ripat
2
是像你这样的人才是 Stack Overflow 真正的英雄。 - Zapps Ceo

12

我也遇到了同样的错误,但当我在$dompdf->stream()之前使用ob_end_clean()时,它对我有用。

以下是我的代码。

$dompdf = new DOMPDF();
$dompdf->load_html($html); 
$dompdf->render();    
$pdf = $dompdf->output();
$invnoabc = 'Bokkinglist.pdf';
ob_end_clean();
$dompdf->stream($invnoabc);
exit;

7

是的,这是dompdf的一个问题。但我能够克服这个问题。我创建了一个用于PDF创建的函数。请查看下面的函数:

function pdf_create($html, $filename='', $stream=TRUE) 
{
    require_once("dompdf/dompdf_config.inc.php");
    $savein = 'uploads/policy_doc/';
    $dompdf = new DOMPDF();
    $dompdf->load_html($html);
    $dompdf->render();
    $canvas = $dompdf->get_canvas();
    $font = Font_Metrics::get_font("arial", "normal","12px");

    // the same call as in my previous example
    $canvas->page_text(540, 773, "Page {PAGE_NUM} of {PAGE_COUNT}",
                   $font, 6, array(0,0,0));

    $pdf = $dompdf->output();      // gets the PDF as a string

    file_put_contents($savein.str_replace("/","-",$filename), $pdf);    // save the pdf file on server
    unset($html);
    unset($dompdf); 

}

请注意:您需要将生成的PDF作为字符串获取,然后将其保存到PDF文件中。
编辑:您可以从上述函数中删除以下部分:
    $canvas = $dompdf->get_canvas();
    $font = Font_Metrics::get_font("arial", "normal","12px");

    // the same call as in my previous example
    $canvas->page_text(540, 773, "Page {PAGE_NUM} of {PAGE_COUNT}",
                   $font, 6, array(0,0,0));

这段代码用于处理多页的页眉。

谢谢你的回答,但不幸的是它对我没有用。为什么要使用get_canvas()?请你能解释一下这段代码吗?再次感谢。 - sarincm99
你遇到了什么错误?你可以在代码中省略get_canvas。如果你有多个页面,那么对于每个页面的页眉都要这样做。 - Ripa Saha
非常感谢,它起作用了 :) 没有言语来表达我的感激之情..我已经追寻它两天了..现在终于松了一口气。 - sarincm99
1
你可以使用 stream(),但请参考下面 AntonAL 的建议。 - ripat

2

这对我很有用,最终我的代码看起来像这样:

$html =
  '<html><body>'.
  '<p>Put your html here, or generate it with your favourite '.
  'templating system.</p>'.
  '</body></html>';
function pdf_create($html, $filename='', $stream=TRUE) 
{
    require_once('scripts/vendor/dompdf/dompdf/dompdf_config.inc.php');
    $savein = '';
    $dompdf = new DOMPDF();
    $dompdf->load_html($html);
    $dompdf->render();
    $canvas = $dompdf->get_canvas();
    $font = Font_Metrics::get_font("arial", "normal","12px");

    /*// the same call as in my previous example
    $canvas->page_text(540, 773, "Page {PAGE_NUM} of {PAGE_COUNT}",
                   $font, 6, array(0,0,0));*/

    $pdf = $dompdf->output();      // gets the PDF as a string

    file_put_contents("arquivo.pdf",$pdf);  // save the pdf file on server

    unset($html);
    unset($dompdf); 

}

pdf_create($html);

1

我使用dompdf创建的pdf文件出现了问题。我在notepad++中打开pdf文件,发现以下php错误与dompdf相关。

Message:  "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"

由于旧版本的dompdf无法支持php 7版本,因此出现了这种情况。更新dompdf库后,问题得到解决。
下载最新的dompdf库here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接