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']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Pilot'); ?></dt>
    <dd>
        <?php echo h($check['Person']['first'] . ' ' .  $check['Person']['last']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Flight Date'); ?></dt>
    <dd>
        <?php echo h($check['Check']['flight_date']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Check Type'); ?></dt>
    <dd>
        <?php echo h($check['Check']['check_type']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Aircraft'); ?></dt>
    <dd>
        <?php echo h($check['Aircraft']['registration']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Hours'); ?></dt>
    <dd>    <?php echo h($check['Check']['hours']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Conditions'); ?></dt>
    <dd>
        <?php echo h($check['Check']['conditions']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Passed'); ?></dt>
    <dd>
        <?php echo h($check['Check']['passed']); ?>
        &nbsp;
    </dd>
    <dt><?php echo __('Notes'); ?></dt>
    <dd>
        <?php echo h($check['Check']['notes']); ?>
        &nbsp;
    </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-&gt;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中文字体乱码解决办法(特别是代码迁移引起的乱码)

php   dompdf包如何将HTML页面导出中文无乱码的PDF文档

老是遇到乱码问题:它是如何产生的,又如何解决呢?

引入js文件产生乱码问题

引入js文件产生乱码问题

SpringMVC--05 解决中文乱码