DOMPDF 产生乱码
Posted
技术标签:
【中文标题】DOMPDF 产生乱码【英文标题】:DOMPDF produces gibberish 【发布时间】:2015-03-15 05:15:10 【问题描述】:我已按照http://www.syahzul.com/cakephp/how-to-generate-pdf-in-cakephp-2-x-with-dompdf/ 上的说明安装了 DOMPDF 0.6.1 版。 当我在查看页面上按下 PDF 按钮时,会显示乱码。 (见下文)。我检查了字体是否安装在类库中。 有什么建议吗?
第 2 步(在 /app/Config/routes.php 中
Router::parseExtensions('pdf');
第 3 步(在 ChecksController.php 中)
class ChecksController extends AppController
public $components = array('Paginator', 'Session', 'RequestHandler');
第 4 步(在 /app/View/Layouts/pdf/default.ctp 中)
require_once(APP . 'Vendor' . DS . 'dompdf' . DS
.dompdf_config.inc.php');
spl_autoload_register('DOMPDF_autoload');
$dompdf = new DOMPDF();
$dompdf->set_paper = 'A4';
$dompdf->load_html(utf8_decode($content_for_layout), Configure::read('App.encoding'));
$dompdf->render();
echo $dompdf->output();
第 5 步(在 ChecksController.php 中)
public function view_pdf($id = null)
$this->Check->id = $id;
if (!$this->Check->exists())
throw new NotFoundException(__('Invalid Check'));
// increase memory limit in PHP
ini_set('memory_limit', '512M');
$this->set('check', $this->Check->read(null, $id));
第 6 步(在 checks\app\View\Checks\pdf\view_pdf.ctp 中)
<div class="checks view">
<h2><?php echo __('Check Flight'); ?></h2>
<?php //echo debug($check); ?>
<dl>
<dt><?php echo __('Instructor'); ?></dt>
<dd>
<?php echo h($check['Instructor']['first'] . ' ' . $check['Instructor']['last']); ?>
</dd>
<dt><?php echo __('Pilot'); ?></dt>
<dd>
<?php echo h($check['Person']['first'] . ' ' . $check['Person']['last']); ?>
</dd>
<dt><?php echo __('Flight Date'); ?></dt>
<dd>
<?php echo h($check['Check']['flight_date']); ?>
</dd>
<dt><?php echo __('Check Type'); ?></dt>
<dd>
<?php echo h($check['Check']['check_type']); ?>
</dd>
<dt><?php echo __('Aircraft'); ?></dt>
<dd>
<?php echo h($check['Aircraft']['registration']); ?>
</dd>
<dt><?php echo __('Hours'); ?></dt>
<dd> <?php echo h($check['Check']['hours']); ?>
</dd>
<dt><?php echo __('Conditions'); ?></dt>
<dd>
<?php echo h($check['Check']['conditions']); ?>
</dd>
<dt><?php echo __('Passed'); ?></dt>
<dd>
<?php echo h($check['Check']['passed']); ?>
</dd>
<dt><?php echo __('Notes'); ?></dt>
<dd>
<?php echo h($check['Check']['notes']); ?>
</dd>
<div class='items'>
<dt><?php echo __('Additional Areas'); ?></dt>
<dd>
<?php foreach ($check['Assessment'] as $assessment): ?>
<?php echo h($assessment['description']); ?><br/>
<?php endforeach; ?>
</dd>
</div>
</dl>
第 7 步(在 app\View\Checks\view.ctp 中)
<li><?php echo $this->Html->link(__('PDF'), array('action' => 'view_pdf', 'ext' => 'pdf', $check['Check']['id']));?></li>
输出:
%PDF-1.3 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R /OpenAction 8 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 9 0 R /F2 10 0 R >> >> /MediaBox [0.000 0.000 612.000 792.000] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Creator (dompdf) /CreationDate (D:20150315060510+01'00') /ModDate (D:20150315060510+01'00') >> endobj 6 0 obj << /Type /Page /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 349 >> stream x�m��k�0���W�c�D�ڷ�ha��>��C�H�5�5�����ӴI�K>�~sw����a�wq�d�@�������s��6�i ��1� �/�$",�ȸ?`��s�E��4bL�vqϯa$�3�#��g��xJ�����T�+�A�U�jSA�K�?wѧ=ʦ�[]�y���"0���?���|x��(lfd+�,��������PUf!2s����數r@]I��z��>�$�:|��x됣�qpFf�\�|>��9�KS§nލ��֏ �#���y���tpJ+;�Mv�5G����5LUۦu�Q�Up.�V'!܈��͇yܻ�(mq��e� endstream endobj 8 0 obj [6 0 R /Fit] endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj xref 0 11 0000000000 65535 f 0000000008 00000 n 0000000091 00000 n 0000000137 00000 n 0000000302 00000 n 0000000331 00000 n 0000000445 00000 n 0000000508 00000 n 0000000929 00000 n 0000000957 00000 n 0000001065 00000 n trailer << /Size 11 /Root 1 0 R /Info 5 0 R >> startxref 1175 %%EOF
【问题讨论】:
“乱码”是什么意思?由于内部格式丢失,因此很难诊断您的 PDF。您可以发布屏幕截图、使用格式化的 PDF 源更新问题或链接到文件。查看预期的 HTML 也会有所帮助(其他一切看起来都很合理)。 【参考方案1】:大概就是这一行:
$dompdf->load_html(utf8_decode($content_for_layout), Configure::read('App.encoding'));
$content_for_layout 已弃用:改用$this->fetch('content')
。
【讨论】:
不,那没有用:我也试过 $dompdf->load_html(utf8_decode($this->fetch('content')), Configure::read('App.encoding')) ; 此行仍应更改。除了答案中建议的更改之外,您还应该删除utf8_decode()
。这不是必需的,而且对包含非 ascii 字符的文档有害。
正如我所说,我尝试了 $dompdf->load_html($this->fetch('content'));和 $dompdf->load_html(utf8_decode($this->fetch('content'), Configure::read('App.encoding')); 都不起作用
上述设置中是否有任何步骤不正确,或者可能遗漏了什么?
不确定您的建议。如果只是像下面这样去掉 utf8() 没区别 $dompdf->load_html($this->fetch('content'), Configure::read('App.encoding'));以上是关于DOMPDF 产生乱码的主要内容,如果未能解决你的问题,请参考以下文章
dompdf中文字体乱码解决办法(特别是代码迁移引起的乱码)