Internal error WKHTMLTOPDF

I have a page that should display as a PDF using the WKHTMLTOPDF mechanism. When I click the link to load the page, I get this error:

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

The stack trace is as follows:

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

  } } $output = $Engine->output(); 

APP \ Plugin \ CakePdf \ View \ PdfView.php line 97 → CakePdf-> output (line)

prints this

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

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

then prints the page exactly the way I want it too.

CORE \ Cake \ Controller \ Controller.php line 956 -> PdfView-> render (null, null)

 null null 

CORE \ Cake \ Routing \ Dispatcher.php line 193 -> Controller-> render ()

  } if ($render && $controller->autoRender) { $response = $controller->render(); } elseif ($response->body() === null) { 

CORE \ Cake \ Routing \ Dispatcher.php line 161 -> Dispatcher -> _ invoke (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 \ webroot \ index.php line 92 -> Dispatcher-> dispatch (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) { } 

here is my 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', )); 

view in my controller

 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 } 

my application 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')); /** 

here is the view i want to present as 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('dmY', strtotime($invoicedetails['Invoice']['created'])); ?></td> </tr> <tr> <th>Due Date: </th> <td><?php echo date('dmY', 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> 
+4
source share
2 answers

there were two issues in this code that needed to be resolved

  • was binary in bootstrap.php Original:

    Configure :: write ('CakePdf', array ('engine' => 'CakePdf.WkHtmlToPdf', 'Download' => true, 'binary' => 'C: \ Program Files (x86) \ wkhtmltopdf \ wkhtmltopdf.exe' ));

new

  Configure::write('CakePdf', array( 'engine' => 'CakePdf.WkHtmlToPdf', 'download'=>false, 'binary'=>'C:\\wkhtmltopdf\\wkhtmltopdf.exe', 'orientation'=>'portrait')); 
  • In my account controller, I had a spelling error with the word portrait.
0
source

One HUGE PROBLEM on Windows and php proc_open that CakePdf uses is SPACES in binary, and Exception at https://github.com/ceeram/CakePdf/blob/master/Pdf/Engine/WkHtmlToPdfEngine.php#L35 is only throwing back a general message and an error did NOT occur.

On / WkHtmlToPdfEngine.php # L36 expands with the contents of ['stderr] to see the real error:

 throw new CakeException("WKHTMLTOPDF didn't return any data. Returned Error: ".$content['stderr']); 

A simple solution:

will not work

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

WORKS

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

Source: https://habr.com/ru/post/1441969/


All Articles