Cakephp WKHTMLTOPDF内部错误

Cakephp WKHTMLTOPDF内部错误,cakephp,plugins,wkhtmltopdf,Cakephp,Plugins,Wkhtmltopdf,我有一个页面应该在WKHTMLTOPDF引擎的帮助下呈现为pdf格式。单击链接加载页面时,出现以下错误: WKHTMLTOPDF didn't return any data Error: An Internal Error Has Occurred. 堆栈跟踪如下所示: APP\Plugin\CakePdf\Pdf\CakePdf.php第234行→ WkHtmlToPdfEngine->output() APP\Plugin\CakePdf\View\PdfView.ph

我有一个页面应该在WKHTMLTOPDF引擎的帮助下呈现为pdf格式。单击链接加载页面时,出现以下错误:

WKHTMLTOPDF didn't return any data
Error: An Internal Error Has Occurred.
堆栈跟踪如下所示:

APP\Plugin\CakePdf\Pdf\CakePdf.php第234行→ WkHtmlToPdfEngine->output()

APP\Plugin\CakePdf\View\PdfView.php第97行→ CakePdf->输出(字符串)

打印这个

$this->response->download($this->getFilename()); }

然后打印出我想要的页面

CORE\Cake\Controller\Controller.php行956→ PdfView->渲染(空,空)

CORE\Cake\Routing\Dispatcher.php第193行→ 控制器->渲染()

CORE\Cake\Routing\Dispatcher.php第161行→ Dispatcher->\u调用(InvoicesController、CakerRequest、CakerResponse)

APP\webroot\index.php第92行→ 调度员->调度(CakeRequest,CakeResponse)

这是我的bootstrap.php

<?php
    CakePlugin::loadAll();  
    CakePlugin::load('DebugKit');
     CakePlugin::load('CakePdf', array('bootstrap' => true, 'routes' => true));
     Configure::write('CakePdf', array(
        'engine' => 'CakePdf.WkHtmlToPdf',
        'download'=>true,
        'binary'=>'C:\\Program Files (x86)\\wkhtmltopdf\\wkhtmltopdf.exe'));

    // Enable the Dispatcher filters for plugin assets, and
    // CacheHelper.
    Configure::write('Dispatcher.filters', array(
    'AssetDispatcher',
    'CacheDispatcher'
    ));

    // Add logging configuration.
    CakeLog::config('debug', array(
    'engine' => 'FileLog',
    'types' => array('notice', 'info', 'debug'),
    'file' => 'debug',
    ));
    CakeLog::config('error', array(
    'engine' => 'FileLog',
    'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
    'file' => 'error',
    ));
我的应用程序控制器

public function view($id = null) {
    $this->set('title_for_layout', 'Invoices');
    $this->set('stylesheet_used', 'homestyle');
    $this->set('image_used', 'eBOXLogoHome.png');
    $this->layout='adminpdf';


    $this->pdfConfig = array('engine' => 'CakePdf.WkHtmlToPdf');

            $this->Invoice->id = $id;
            if (!$this->Invoice->exists()) {
                throw new NotFoundException(__('Invalid invoice'));
            }
            $this->pdfConfig = array(
                'engine'=>'CakePdf.WkHtmlToPdf',
                'orientation' => 'potrait',
                'filename' => 'Invoice_' . $id
            );

            $this->set('invoice', $this->Invoice->read(null, $id));
        //Retrieve Account Id of current User       
        $accountid=$this->Auth->user('account_id');




        //Find all Invoices where $conditions are satisfied
        $invoicedetails=$this->Invoice->find('first', array(
        'conditions' => array('Invoice.id'=>$id)));

        //prints fieldsInvoice details, including invoice and field information
        $invoices=$this->FieldsInvoice->find('all',array(
        'conditions'=>array(
        'invoice_id'=>$id)));

        $itemInvoice=$this->InvoicesItem->find('all',array('conditions'=>array('invoice_id'=>$id)));

        //Set variables
        $this->set('invoicedetails', $invoicedetails);  
        $this->set('invoice', $invoices);   
        $this->set('accountid', $accountid);
        $this->set('itemInvoice', $itemInvoice);

    }



//End of Controller


    }
class AppController extends Controller {

    public $components = array(
        'DebugKit.Toolbar',
        'Session', 
        'Auth'=>array(
            'loginRedirect'=>array('controller'=>'users', 'action'=>'login'),
            'logoutRedirect'=>array('controller'=>'users', 'action'=>'login'),
            'invoiceRedirect'=>array('controller'=>'invoices', 'action'=>'viewinvoice'),
            'authError'=>"You can't access this page",
            'authorize'=>array('Controller')
        ),
        'RequestHandler'
    );
routes.php

 */
    CakePlugin::routes();
    Router::mapResources(array('Invoices'));
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
/**
这是我想要呈现为pdf格式的视图

<div id = "content">
<h2>View Invoice</h2>
                <table id="data">


    <?php

        if($invoicedetails['Invoice']['scheduled']==1)
        {
            $status = 'Scheduled';  
            $fcol = 'Black';
            $bgcol = '#EBD8E8';
            $pay = NULL;
            $dispute = NULL;
        }
        else if($invoicedetails['Invoice']['paid']==1)
        {
            $status = 'Paid';
            $fcol = 'Black';
            $bgcol = '#B9FAEA';
            $pay = NULL;
            $dispute = NULL;
        }
        else if($invoicedetails['Invoice']['sender_id']==$accountid)
        {
            $status = 'Sent';
            $fcol = 'Black';
            $bgcol = '#F8FAC0';
            $pay = NULL;
            $dispute = NULL;
        }
        else if($invoicedetails['Invoice']['receiver_id']==$accountid)
        {
            $status = 'Received';
            $fcol = 'Black';
            $bgcol = '#FAB9B9';
            $pay = $this->Html->link('Pay', array('controller' => 'Invoices','action'=>'pay_admin',$invoicedetails['Invoice']['id'] )) ;
            $dispute = $this->Html->link('Dispute', array('controller' => 'Disputes','action'=>'add_admin',$invoicedetails['Invoice']['id'] ));
        }



    ?>                      
                <tr>
                <th>Sender: </th>
                <td><?php echo $invoicedetails['SenderAccount']['account_name'];?> </td>
                </tr>

                <tr>
                <th>Receiver: </th>
                <td><?php echo $invoicedetails['ReceiverAccount']['account_name'];?> </td>
                </tr>

                <tr>
                <th>Invoice ID: </th>
                <td><?php echo $invoicedetails['Invoice']['id'];?> </td>
                </tr>

                <tr>
                <th>Invoice Date: </th>
                <td><?php echo date('d.m.Y', strtotime($invoicedetails['Invoice']['created'])); ?></td>
                </tr>

                <tr>
                <th>Due Date: </th>
                <td><?php echo date('d.m.Y', strtotime($invoicedetails['Invoice']['expiry_date'])); ?></td>
                </tr>

                <tr>
                <th>Status: </th>
                <td bgcolor='<?php echo $bgcol ?>'><?php echo $status ;?> </td>
                </tr>

                <tr>
                <th>Actions: </th>
                <td><?php echo $pay ?> <?php echo  $dispute ?></td>
                </tr>               


                </table>
                <br>
                <table id="data">
                <tr>
                    <th>Item Name</th>
                    <th>Description</th>
                    <th>Price Per Unit</th>
                    <th>Quantity</th>
                </tr>
                <?php foreach($itemInvoice as $itemInvoices):?>
                <tr>
                <td><?php echo $itemInvoices['Item']['name']; ?></td>
                <td><?php echo $itemInvoices['Item']['description']; ?></td>
                <td>$<?php echo number_format($itemInvoices['Item']['price'], 2, '.', ','); ?></td>
                <td><?php echo $itemInvoices['InvoicesItem']['quantity']; ?></td>
                </tr>
    <?php endforeach; ?>
                </table>

                <br>

                <table id="data">
                <tr>
                    <th>Field Name</th>
                    <th>Entered Value</th>
                </tr>


        <?php foreach($invoice as $invoices):?>
<tr>
<td><?php echo $invoices['Field']['name']; ?> :</td>
<td><?php echo $invoices['FieldsInvoice']['entered_value']; ?></td>
</tr>
    <?php endforeach; ?>



            </table>
            <br><br>

查看发票
发件人:
接收人:
发票ID:
发票日期:
到期日:
地位:
行动:

项目名称 描述 单价 量 $
字段名 输入值 :


此代码有两个问题需要解决

  • 是bootstrap.php中的二进制文件 原件:

    Configure::write('CakePdf',数组( “引擎”=>“CakePdf.WkHtmlToPdf”, “下载”=>true, '二进制'=>'C:\ProgramFiles(x86)\wkhtmltopdf\wkhtmltopdf.exe')

  • 新的

  • 在我的发票控制器中,我的“肖像”一词有一个拼写错误

  • CakePdf正在使用的Windows和php proc__open上的一个巨大问题是二进制中的空格,中的异常只是返回一条通用消息,而不是发生的错误

    在/WkHtmlToPdfEngine.php上#L36使用内容['stderr]进行扩展以查看真正的错误:

    throw new CakeException("WKHTMLTOPDF didn't return any data. Returned Error: ".$content['stderr']);
    
    简单解决方案:

    不起作用

    'binary'=> 'C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe'
    
    有效

    'binary'=> 'C:\\Progra~1\\wkhtmltopdf\\wkhtmltopdf.exe'
    

    嘿,我面临着完全相同的问题。但这种解决方案对我不起作用。你能告诉我是否有其他方法可以尝试吗?你也可以检查一下你是否在php中启用了proc_open函数。一些主机出于安全原因禁用了它。2年后,再次面临这个问题,并使用本文解决了它。这对我很有用,谢谢!Windows/Wamp上的CakePHP 2.7和CakePDF 1.02
    class AppController extends Controller {
    
        public $components = array(
            'DebugKit.Toolbar',
            'Session', 
            'Auth'=>array(
                'loginRedirect'=>array('controller'=>'users', 'action'=>'login'),
                'logoutRedirect'=>array('controller'=>'users', 'action'=>'login'),
                'invoiceRedirect'=>array('controller'=>'invoices', 'action'=>'viewinvoice'),
                'authError'=>"You can't access this page",
                'authorize'=>array('Controller')
            ),
            'RequestHandler'
        );
    
     */
        CakePlugin::routes();
        Router::mapResources(array('Invoices'));
        Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
    /**
    
    <div id = "content">
    <h2>View Invoice</h2>
                    <table id="data">
    
    
        <?php
    
            if($invoicedetails['Invoice']['scheduled']==1)
            {
                $status = 'Scheduled';  
                $fcol = 'Black';
                $bgcol = '#EBD8E8';
                $pay = NULL;
                $dispute = NULL;
            }
            else if($invoicedetails['Invoice']['paid']==1)
            {
                $status = 'Paid';
                $fcol = 'Black';
                $bgcol = '#B9FAEA';
                $pay = NULL;
                $dispute = NULL;
            }
            else if($invoicedetails['Invoice']['sender_id']==$accountid)
            {
                $status = 'Sent';
                $fcol = 'Black';
                $bgcol = '#F8FAC0';
                $pay = NULL;
                $dispute = NULL;
            }
            else if($invoicedetails['Invoice']['receiver_id']==$accountid)
            {
                $status = 'Received';
                $fcol = 'Black';
                $bgcol = '#FAB9B9';
                $pay = $this->Html->link('Pay', array('controller' => 'Invoices','action'=>'pay_admin',$invoicedetails['Invoice']['id'] )) ;
                $dispute = $this->Html->link('Dispute', array('controller' => 'Disputes','action'=>'add_admin',$invoicedetails['Invoice']['id'] ));
            }
    
    
    
        ?>                      
                    <tr>
                    <th>Sender: </th>
                    <td><?php echo $invoicedetails['SenderAccount']['account_name'];?> </td>
                    </tr>
    
                    <tr>
                    <th>Receiver: </th>
                    <td><?php echo $invoicedetails['ReceiverAccount']['account_name'];?> </td>
                    </tr>
    
                    <tr>
                    <th>Invoice ID: </th>
                    <td><?php echo $invoicedetails['Invoice']['id'];?> </td>
                    </tr>
    
                    <tr>
                    <th>Invoice Date: </th>
                    <td><?php echo date('d.m.Y', strtotime($invoicedetails['Invoice']['created'])); ?></td>
                    </tr>
    
                    <tr>
                    <th>Due Date: </th>
                    <td><?php echo date('d.m.Y', strtotime($invoicedetails['Invoice']['expiry_date'])); ?></td>
                    </tr>
    
                    <tr>
                    <th>Status: </th>
                    <td bgcolor='<?php echo $bgcol ?>'><?php echo $status ;?> </td>
                    </tr>
    
                    <tr>
                    <th>Actions: </th>
                    <td><?php echo $pay ?> <?php echo  $dispute ?></td>
                    </tr>               
    
    
                    </table>
                    <br>
                    <table id="data">
                    <tr>
                        <th>Item Name</th>
                        <th>Description</th>
                        <th>Price Per Unit</th>
                        <th>Quantity</th>
                    </tr>
                    <?php foreach($itemInvoice as $itemInvoices):?>
                    <tr>
                    <td><?php echo $itemInvoices['Item']['name']; ?></td>
                    <td><?php echo $itemInvoices['Item']['description']; ?></td>
                    <td>$<?php echo number_format($itemInvoices['Item']['price'], 2, '.', ','); ?></td>
                    <td><?php echo $itemInvoices['InvoicesItem']['quantity']; ?></td>
                    </tr>
        <?php endforeach; ?>
                    </table>
    
                    <br>
    
                    <table id="data">
                    <tr>
                        <th>Field Name</th>
                        <th>Entered Value</th>
                    </tr>
    
    
            <?php foreach($invoice as $invoices):?>
    <tr>
    <td><?php echo $invoices['Field']['name']; ?> :</td>
    <td><?php echo $invoices['FieldsInvoice']['entered_value']; ?></td>
    </tr>
        <?php endforeach; ?>
    
    
    
                </table>
                <br><br>
    
     Configure::write('CakePdf', array(
        'engine' => 'CakePdf.WkHtmlToPdf',
        'download'=>false,
        'binary'=>'C:\\wkhtmltopdf\\wkhtmltopdf.exe',
        'orientation'=>'portrait'));
    
    throw new CakeException("WKHTMLTOPDF didn't return any data. Returned Error: ".$content['stderr']);
    
    'binary'=> 'C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe'
    
    'binary'=> 'C:\\Progra~1\\wkhtmltopdf\\wkhtmltopdf.exe'