2012-10-25 89 views
4

我有一個頁面,應該在WKHTMLTOPDF引擎的幫助下呈現爲pdf。當我點擊鏈接加載頁面,我得到這個錯誤:WKHTMLTOPDF內部錯誤

WKHTMLTOPDF didn't return any data 
Error: An Internal Error Has Occurred. 

堆棧跟蹤如下:

APP \插件\ CakePdf \ PDF閱讀器\ CakePdf.php線234→WkHtmlToPdfEngine->輸出()

} 
} 

$output = $Engine->output(); 

APP \插件\ CakePdf \視圖\ PdfView.php線97→CakePdf->輸出(字符串)

打印這個

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

$this->Blocks->set('content', $this->renderer()->output($content)); 

return $this->Blocks->get('content'); 

則恰好打印出來的頁面我多麼希望它太

CORE \蛋糕\控制器\ Controller.php這樣線956→PdfView->渲染(NULL,NULL)

null 
null 

CORE \蛋糕\路由\ Dispatcher.php線193→控制器 - >渲染()

} 

     if ($render && $controller->autoRender) { 
      $response = $controller->render(); 

     } elseif ($response->body() === null) { 

CORE \蛋糕\路由\ Dispatcher.php線161→分派器 - > _調用(InvoicesController,CakeRequest,CakeResponse)

object(InvoicesController) { 
    helpers => array(
     [maximum depth reached] 
    ) 
    uses => array(
     [maximum depth reached] 
    ) 
    paginate => array(
     [maximum depth reached] 
    ) 
    components => array(
     [maximum depth reached] 
    ) 
    name => 'Invoices' 
    request => object(CakeRequest) {} 
    response => object(CakeResponse) {} 
    viewPath => 'Invoices' 
    layoutPath => 'pdf' 
    viewVars => array(
     [maximum depth reached] 
    ) 
    view => 'view' 
    layout => 'adminpdf' 
    autoRender => false 
    autoLayout => true 
    Components => object(ComponentCollection) {} 
    viewClass => 'Pdf' 
    View => object(PdfView) {} 
    ext => '.ctp' 
    plugin => null 
    cacheAction => false 
    passedArgs => array(
     [maximum depth reached] 
    ) 
    scaffold => false 
    methods => array(
     [maximum depth reached] 
    ) 
    modelClass => 'Invoice' 
    modelKey => 'invoice' 
    validationErrors => null 
    Toolbar => object(ToolbarComponent) {} 
    Session => object(SessionComponent) {} 
    Auth => object(AuthComponent) {} 
    RequestHandler => object(RequestHandlerComponent) {} 
    pdfConfig => array(
     [maximum depth reached] 
    ) 
    Invoice => object(Invoice) {} 
    FieldsInvoice => object(FieldsInvoice) {} 
    InvoicesItem => object(InvoicesItem) {} 
} 
object(CakeRequest) { 
    params => array(
     [maximum depth reached] 
    ) 
    data => array([maximum depth reached]) 
    query => array([maximum depth reached]) 
    url => 'Invoices/view/1.pdf' 
    base => '/pra' 
    webroot => '/pra/' 
    here => '/pra/Invoices/view/1.pdf' 
} 
object(CakeResponse) { 

} 

APP \根目錄\的index.php線92→Dispatcher->調度(CakeRequest,CakeResponse)

object(CakeRequest) { 
    params => array(
     [maximum depth reached] 
    ) 
    data => array([maximum depth reached]) 
    query => array([maximum depth reached]) 
    url => 'Invoices/view/1.pdf' 
    base => '/pra' 
    webroot => '/pra/' 
    here => '/pra/Invoices/view/1.pdf' 
} 
object(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> 

回答

0

有這個代碼,需要兩個問題解決

  1. 是在bootstrap.php中二進制 原件:

    配置::寫入( 'CakePdf',陣列( '發動機'=> 'CakePdf.WkHtmlToPdf', '下載'=>真, 'binary'=>'C:\ Program Files(x86)\ wkhtmltopdf \ wkhtmltopdf。可執行程序'));

Configure::write('CakePdf', array(
    'engine' => 'CakePdf.WkHtmlToPdf', 
    'download'=>false, 
    'binary'=>'C:\\wkhtmltopdf\\wkhtmltopdf.exe', 
    'orientation'=>'portrait')); 
  1. 在我的發票控制器我有字畫像拼寫錯誤。在Windows
+0

嘿,我面臨完全相同的問題。但是這個解決方案並不適合我。你能否告訴我,如果有其他方式,我應該嘗試一下。 – Deepak

+0

你也可以檢查你是否在php中啓用了proc_open函數。出於安全原因,某些主機禁用它。 – Radu

+0

2年後,再次面臨這個問題,並解決它使用這篇文章https://webtoolsplus.com/cakephp-wkhtmltopdf-didnt-return-any-data/ – Deepak

3

一個巨大的問題和PHP的proc_open是CakePdf使用的二進制空間和https://github.com/ceeram/CakePdf/blob/master/Pdf/Engine/WkHtmlToPdfEngine.php#L35的例外是隻拋回一個普通的消息並沒有發生的錯誤。

在/WkHtmlToPdfEngine.php#L36與內容擴展['標準錯誤]看到真正的錯誤:

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' 
+0

這對我工作,謝謝! Windows/Wamp上的CakePHP 2.7和CakePDF 1.02 – Chris