【问题标题】:dompdf->stream not working in joomladompdf->流在 joomla 中不起作用
【发布时间】:2016-05-17 13:38:27
【问题描述】:

我正在尝试在我的 Joomla 3 组件中使用 dompdf,但它生成的要下载的 PDf 总是损坏。我在文本编辑器中打开了 PDF 文件,发现损坏的原因是它包含了 joomla 中的所有标题、链接、样式表和 javascript,即使我只传递了我需要的 html。

我在 joomla 组件视图(default.php 模板)中使用的代码是:

<?php
defined('_JEXEC') or die('Restricted access');
ob_start();
?>
   <div class="qp-div1">
     <table class="table table-bordered">
       <thead>
          <tr>
            <th colspan="2">Account Status</th>
          </tr>
       </thead>
       <tbody>
         <tr>
           <th>Reference</th>
             <td><?php echo $this->userdetails['cardcode']; ?></td>
        ... more html
<?php

require_once('dompdf/autoload.inc.php');
use Dompdf\Dompdf;
$html = ob_get_contents();
$dompdf = new Dompdf();
$dompdf->setPaper('A4', 'portrait');
$dompdf->setBasePath('');
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream('order');
ob_flush();
ob_end_clean();
?>

即使我只传递了我想传递给 dompdf->loadHtml 的 HTML,但当你运行 dompdf->stream 时,它最终还是使用了所有的 joomla html,包括所有的样式表、javascript 和更多。

当我使用 dompdf->output() 将输出转储到文件时,文件实际上是可以的,所以只有使用 dompdf->stream 有问题。

我用来转储 pdf 的代码插入到流命令之前,如下所示:

$file_to_save = '/temp/pdf/file.pdf';
file_put_contents($file_to_save, $dompdf->output()); 
$dompdf->stream('order');

我可以做些什么来阻止 $dompdf->stream 命令使用包括所有 Joomla html ?

干杯

【问题讨论】:

  • $dompdf->stream() 命令可能不是问题的根源。流式传输 PDF 后,dompdf 不会结束脚本处理。通常,如果启用了输出缓冲,您会看到类似的问题。我的猜测是 1)在 dompdf 流式传输 PDF 之前,输出缓冲区中正在捕获一些非 PDF 内容;或 2) Joomla 在 dompdf 完成后正在做某事。测试这一点的一种方法是在渲染之前清理输出缓冲区,并在调用流方法之后退出()。

标签: joomla dompdf


【解决方案1】:

我通过在我的组件中使用附加文件解决了我的问题,但没有将页面加载到 joomla 中(以避免额外的标题等)。

所以我的解决方案(以防其他人也想这样做)是:

  1. 在原始视图中使用 ob_start、ob_flush 和 ob_end_clean 来捕获我想在 pdf 中使用的 html。
  2. 在页面底部创建一个表单,对我想要的数据进行 urlencode 并将这些数据发布到新页面(在我的例子中是 COPMPONENT/libraries/downloadfile.php)。
  3. 表单将数据发布到新页面,新页面简单地生成 PDF 并将其传递回浏览器,然后下载。

这对我来说是完美的,因为服务器上不会生成额外的文件(这避免了安全和权限问题)。 这也意味着只有在最终用户点击页面底部的下载PDF按钮(以新形式)时才会生成PDF,因此没有不必要的处理。

新代码如下: 1.在我看来(文件tmpl/default.php)

<?php
defined('_JEXEC') or die('Restricted access');
ob_start();
?>
<div class="qp-div1">
<table class="table table-bordered">
<thead>
<tr>
<th colspan="2">Account Status</th>
</tr>
</thead>
<tbody>
.... more html
</tbody>
</table>
</div>
<?php
$html .= ob_get_contents();
$html = urlencode($html);
ob_flush();
ob_end_clean();
?>
<form method="POST" action="/components/com_questportal/libraries/downloadfile.php" >
<input type="hidden" name="dlname" value="<?php echo $this->userdetails['cardcode'] . '_status'; ?>" >
<input type="hidden" name="dlhtml" value="<?php echo $html; ?>" >
<input type="hidden" name="dlo" value="landscape" >
<input type="image" src="/media/com_questportal/images/downloadaspdf.png" alt="Submit">
</form>

所以这显示了 ob_start(),然后是 ob_get_contents,我在其中存储了 PDF 文件的 html 代码。 然后我使用 ob_flush 和 ob_end_clean 来停止输出缓冲。 您还可以看到我对从 ob_get_contents 接收到的 HTML 进行了 urlencode,并将其传递到页面底部的表单中。 我还通过表单传递方向和名称(因为这些都在 downloadfile.php 文件中使用)。

下一段代码是从我的表单中发布的 downloadfile.php。此页面非常简单,仅包含:

<?php
$html = urldecode($_POST['dlhtml']);
$name = $_POST['dlname'];
$orientation = $_POST['dlo'];

require_once('dompdf/autoload.inc.php');
use Dompdf\Dompdf;

$dompdf = new Dompdf();
$dompdf->setPaper('A4', $orientation);
$dompdf->setBasePath('');
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream($name);
?>

因此,当用户单击我页面底部的下载 pdf 图像时,它会加载 downloadfile.php 页面,将输出流式传输到浏览器然后关闭页面(即它实际上从未显示 downloadfile.php 页面)。

干杯

【讨论】:

    【解决方案2】:

    尝试在刷新输出之前清除输出缓冲区,如下例所示

    <?php
    defined('_JEXEC') or die('Restricted access');
       $html = '<div class="qp-div1">
         <table class="table table-bordered">
           <thead>
              <tr>
                <th colspan="2">Account Status</th>
              </tr>
           </thead>
           <tbody>
             <tr>
               <th>Reference</th>
                 <td>'.$this->userdetails['cardcode'].'</td>
             </tr>
            </tbody>
          </table>';
    require_once('dompdf/autoload.inc.php');
    ob_clean();
    use Dompdf\Dompdf;
    $dompdf = new Dompdf();
    $dompdf->setPaper('A4', 'portrait');
    $dompdf->setBasePath('');
    $dompdf->loadHtml($html);
    $dompdf->render();
    $dompdf->stream('order');
    ob_end_flush();
    ?>
    

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 2018-11-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多