dompdf->流不在joomla中工作

时间:2016-05-17 13:38:28

标签: joomla dompdf

我正在尝试在我的Joomla 3组件中使用dompdf,但它生成的下载的PDf总是损坏的。我在文本编辑器中打开了PDF文件,发现损坏的原因是它包含了来自joomla的所有头文件,链接,样式表和javascript,即使我正在通过我需要的html 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-&gt;流时只传递了我想要dompdf-&gt; loadHtml的HTML,但它最终使用了所有的joomla html,包括所有样式表,javascript和更多。

当我使用dompdf-&gt; output()将输出转储到文件时,文件实际上是正常的,因此只有使用dompdf-&gt;流才会出现问题。

我用来转储pdf的代码是在stream命令之前插入的,看起来像这样:

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

我有什么办法可以阻止$ dompdf-&gt; stream命令使用包含所有Joomla html的内容吗?

干杯

2 个答案:

答案 0 :(得分:1)

我已经修复了我的问题,在我的compnent中使用了一个额外的文件,但没有将页面加载到joomla中(以避免额外的标题等)。

所以我的解决方案(如果其他人想要做同样的事情)是:

  1. 在原始视图中使用ob_start,ob_flush和ob_end_clean来捕获我想在pdf中使用的html。
  2. 在页面底部创建一个表单,用于对我想要的数据进行urlen编码,并将此数据发布到新页面(在我的情况下为COPMPONENT / libraries / downloadfile.php)。
  3. 表单将数据发布到新页面,然后新页面生成PDF并将其传回浏览器,然后下载。
  4. 这对我来说非常完美,因为服务器上没有生成其他文件(这可以避免安全性和权限问题)。 这也意味着只有当最终用户点击页面底部的下载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页面)。

    干杯

答案 1 :(得分:1)

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

<?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();
?>