0

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'));
}  

私はググって、役に立たない答えを見つけようとしました。よろしくお願いします。

4

1 に答える 1

0

表示されているのは、PDF ドキュメントのソースです。したがって、PDF は正しく生成されますが、どこかでブラウザに送信されるコンテンツ タイプが設定されてtext/htmlいます (それは である必要がありますapplication/pdf)。ヘッダーを適切に設定するレイアウトでメソッドを使用していstream()ます(したがって、コントローラーで追加で設定する必要はありません)。

dompdf は PDF をクライアントに送信した後は送信しないexit()ため、出力バッファリングが有効になっている可能性があり、CakePHP は PDF が生成された後にコンテンツ タイプを設定するために何かを行っています。この場合、レイアウトの最後に を追加するだけです。exit()

ただし、CakePHP で content-type/extension のサポートを構成する方がよい場合があります。CakePHP でこれを行ってからしばらく経ちましたが、ルーターRequestHandlerの構成を行う必要があると思います。

于 2016-02-05T21:44:47.253 に答える