【问题标题】:Using Dompdf to view .pdf from CakePHP 2 page使用 Dompdf 从 CakePHP 2 页面查看 .pdf
【发布时间】:2014-07-31 17:21:01
【问题描述】:

我刚刚下载了dompdf-0.6.1,想在我的 CakePHP 2.0.5 应用程序中使用它。

我在 routes.php 中包含了Router::parseExtensions('json', 'pdf'); 并在 app -> View -> Layouts 中创建了一个 default.ctp。

<?php

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();

我希望允许用户以 .pdf 文件的形式查看损益表 - 可以打印。损益表采用startDate和endDate参数生成。

下面的文件是income_statement.ctp。我需要做什么才能让用户通过点击浏览器页面上的链接以 .pdf 格式查看报表?

.......some code...... 

 <div style="text-align:  center">

        <h1><?php echo $this->Session->read("Business.name"); ?><br>Income Statement</h1>
        <h3>
            For period starting <?php echo $startDate; ?> to <?php echo $endDate; ?>
        </h3>
        <table align="center" width="400px;">
            <tr>
                <th style="text-align: left;" colspan="2">Revenue</td>
            </tr>
           ........code.........
                <td style="text-align: left;">
                    <?php
                    $space = "&nbsp;";
                    for ($i = 0; $i < 12; $i++)
                        echo $space;
                    ?>
                    <b>Total Operating Expenses</b>
                </td>
                <td style="text-align: right;"><b><?php echo number_format($totalExpenses + $saleDiscount, 2); ?></b></td>
            </tr>
            <tr>
                <th style="text-align: right"><?php echo $totalDescription; ?></th>
                <th style="text-align: right"><?php echo number_format($net, 2); ?></th>
            </tr>
        </table>      

    ....Link for view as pdf.....
    </div>

【问题讨论】:

    标签: cakephp pdf dompdf


    【解决方案1】:

    您可以将 pdf 保存为实际文件,然后链接到它们(链接到 site.com/pdf/filename.pdf):

    public function action() {
        $view = new View(null, false);
        $view->set(compact('variable1', 'variable2'));
        $view->viewPath = 'Folder';
        $output = $view->render('income_statement', 'layout');
    
        spl_autoload_register('DOMPDF_autoload');
        $dompdf = new DOMPDF();
        $dompdf->set_paper = 'A4';
        $dompdf->load_html(utf8_decode($output), Configure::read('App.encoding'));
        $dompdf->render();
        file_put_contents(APP . 'webroot' . DS . 'pdf' . DS .'filename.pdf');
    }
    

    或者,您可以直接回显 $dompdf 从渲染返回的内容,然后更改页面的标题(链接到 site.com/controller/action.pdf):

    public function action() {
       $this->layout = $this->autoRender = false;
        $this->response->header(array('Content-type' => 'application/pdf'));
    
       //Code for generating pdf data similar to above
    
        echo $dompdf->render();
    }
    

    【讨论】:

    • 感谢您的回复。问题:我将函数放在控制器中...... pdf 是否具有与 html 视图相同的格式(以前从未使用过 dompdf)?解释数组('Content-type' => 'application/pdf').
    • 至于“Explain array("Content-type" => "application/pdf");",请阅读 CakePHP 食谱关于设置标题。 book.cakephp.org/2.0/en/controllers/… 如果您还不知道,HTTP 响应包含定义浏览器需要显示的一堆信息的标头,因此如果您将内容类型更改为 pdf,浏览器将尝试显示/下载 pdf。跨度>
    • 至于“pdf 的格式是否与 html 视图相同?”是的,只要你告诉它使用相同的布局、查看文件等。当我使用 DomPDF 时。我的代码实际上只是绕过 CakePHP 的自动渲染功能,然后手动在视图上调用渲染,这样我就可以在变量中捕获它的输出。你不必总是那样做 DomPDf,但我发现取决于你想要做什么,有时你可能不得不这样做,或者至少它更容易。
    • 好的。谢谢凯。选择第一个选项。
    猜你喜欢
    • 2013-11-27
    • 2021-10-30
    • 2013-04-22
    • 2014-09-05
    • 2013-09-13
    • 2014-05-09
    • 2017-06-25
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多