我有一个页面应该在WKHTMLTOPDF引擎的帮助下呈现为PDF格式。当我单击链接以加载页面时,我收到此错误:
WKHTMLTOPDF didn't return any data
Error: An Internal Error Has Occurred.
堆栈跟踪如下:
APP \ Plugin \ CakePdf \ Pdf \ CakePdf.php第234行→WkHtmlToPdfEngine-> output()
}
}
$output = $Engine->output();
APP \ Plugin \ CakePdf \ View \ PdfView.php第97行→CakePdf->输出(字符串)
打印此
$这 - >响应 - >下载($这 - >用GetFileName()); }
$this->Blocks->set('content', $this->renderer()->output($content));
return $this->Blocks->get('content');
然后打印出我想要的页面
CORE \ Cake \ Controller \ Controller.php第956行→PdfView->渲染(null,null)
null
null
CORE \ Cake \ Routing \ Dispatcher.php第193行→Controller-> render()
}
if ($render && $controller->autoRender) {
$response = $controller->render();
} elseif ($response->body() === null) {
CORE \ Cake \ Routing \ Dispatcher.php第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第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) {
}
这是我的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
}
我的app控制器
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 :(得分:3)
Windows上的一个巨大问题和CakePdf正在使用的php proc_open是二进制文件中的SPACES,而https://github.com/ceeram/CakePdf/blob/master/Pdf/Engine/WkHtmlToPdfEngine.php#L35中的异常只返回一般消息,而不是发生的错误。
在/WkHtmlToPdfEngine.php#L36上扩展内容['stderr]以查看真正的错误:
throw new CakeException("WKHTMLTOPDF didn't return any data. Returned Error: ".$content['stderr']);
简单解决方案:
无法使用
'binary'=> 'C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe'
<强> WORKS 强>
'binary'=> 'C:\\Progra~1\\wkhtmltopdf\\wkhtmltopdf.exe'
答案 1 :(得分:0)
此代码存在两个需要解决的问题
是bootstrap.php中的二进制文件 原文:
配置::写('CakePdf',数组( 'engine'=&gt; 'CakePdf.WkHtmlToPdf', '下载'=&GT;真, 'binary'=&gt;'C:\ Program Files(x86)\ wkhtmltopdf \ wkhtmltopdf.exe'));
新
Configure::write('CakePdf', array(
'engine' => 'CakePdf.WkHtmlToPdf',
'download'=>false,
'binary'=>'C:\\wkhtmltopdf\\wkhtmltopdf.exe',
'orientation'=>'portrait'));