我正在尝试在我的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的内容吗?
干杯
答案 0 :(得分:1)
我已经修复了我的问题,在我的compnent中使用了一个额外的文件,但没有将页面加载到joomla中(以避免额外的标题等)。
所以我的解决方案(如果其他人想要做同样的事情)是:
这对我来说非常完美,因为服务器上没有生成其他文件(这可以避免安全性和权限问题)。 这也意味着只有当最终用户点击页面底部的下载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();
?>