我正在使用CakePHP 2.7.3和CakePdf 1.0.8。我正在尝试为我的 Cake 应用程序生成 pdf 文件,但我得到的 pdf 只有一些奇怪的字符。
生成的 pdf 如下所示:
%PDF-1.3 1 0 obj > endobj 2 0 obj > endobj 3 0 obj > >> /MediaBox [0.0000.000 612.000 792.000] >> endobj 4 0 obj
[/PDF /Text ] endobj 5 0 obj > endobj 6 0 obj > endobj 7 0 obj > stream xœí™KoÛ8…÷ýÎl8"ÅçÒq’¾•¤¨ ÌZµU[-,’… óë‡I•Ýãôn¡‘@ˆÎ-ïˆä¥ò.“Y–‰ñïnóîb)Üó±wVj•‰åZüu-„
2•â•‹¶ýÙ‹y±/êv3”•Šåqµ|6f«WR;ód}9¤¶éÏ:H¯íñŠú×?®GI^—¼P|[ìÆ}*ïdëgÃ~Ûv#‡¶Jšxæë,†o?ÊÕ~dÉ“4×çî`qq;Ö‡Z•æ&æí}Uöã»–ö
œÊd®Ü‹^•ôùøû+ÌíUSîEû]ì·¥¸/Ûûú„—Õ2z‡í·›aS•»Ë£úl•›ºê·ãÛÏò„Ë`‹Ò¹±Î‡˜¥£n:õuƘO•¹¨¥7„ÔL‘AílÕµ}ÿ좫Ö
4Ϸî%€AÃû²ÝtÅýö‘@MÎ[“k³•&•í™·Ry{^úÒ~©ÊU)¾=ŠçŠr~.ëúQPÀ•c¶éªÕP¤•!›wá×ÓƒF!ûdÖK—Q}È•v9t•îŸ³ÝÐW+Š2ï‹nè)hÈðeû˜ºè)`ÈbðÇ 2º)0“V”ÜCŸ˜Ê
ø}šëŸf²å¶k›“ùòÈY?µÛF,šö•b†Lóm¹«ú}GŽLdòãFQCFMÌfZKã(lŽÀ†Ä‹•˜-öCÑUE-«ªlè!Š.0/º¶·?ÊfSPü•ï¦ØSë
这是我的视图文件View/Books/pdf/books_catalogue.ctp
<h2><?php echo __('Books Catalogue'); ?></h2>
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th><?php echo 'Id'; ?></th>
<th><?php echo 'Name'; ?></th>
<th><?php echo 'Author'; ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($books as $book): ?>
<tr>
<td><?php echo h($book['Book']['id']); ?></td>
<td><?php echo h($book['Book']['name']); ?></td>
<td><?php echo h($book['Book']['author']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
我的 pdf 布局:View/Layouts/pdf/default.ctp
<?php
require_once(APP . 'Plugin' .DS. 'CakePdf' .DS. 'Vendor' . DS . 'dompdf' . DS . 'dompdf_config.inc.php');
spl_autoload_register('DOMPDF_autoload');
$dompdf = new DOMPDF();
$dompdf->load_html(utf8_decode($content_for_layout),Configure::read('App.encoding'));
$dompdf->render();
echo $dompdf->output();
$dompdf->stream("Books Catalogue.pdf", array('Attachment'=>'0'));
?>
我的Config/bootstrap.php
CakePlugin::load('CakePdf', array('bootstrap' => true, 'routes' => true));
Configure::write('CakePdf', array(
'engine' => 'CakePdf.DomPdf',
'pageSize' => 'A4',
'orientation' => 'landscape',
'download' => true
));
还有我的控制器:
public function booksCatalogue(){
header("Content-type: application/pdf");
$this->pdfConfig = array(
'orientation' => 'portrait',
'filename' => 'Books Catalogue'
);
$books = $this->Book->find('all');
$this->set(compact('books'));
}
我已经用谷歌搜索并试图找到一些答案,但无济于事。请协助。
您看到的是PDF文档的来源。因此,您的PDF正在正确生成,但是发送到浏览器的内容类型设置为text/html
(应该是application/pdf
)。您在布局中使用 stream()
方法,该方法将适当地设置标头(因此您无需在控制器中额外设置它)。
dompdf 在将 PDF 发送到客户端后不会exit()
,因此您可能启用了输出缓冲,并且 CakePHP 正在某处执行一些操作来设置生成 PDF 后的内容类型。如果是这种情况,您可以在布局的末尾添加一个exit()
。
但是,更好的可能是在 CakePHP 中配置内容类型/扩展支持。自从我在 CakePHP 中执行此操作以来已经有一段时间了,但我相信您需要做一些路由器和 RequestHandler 配置。