【发布时间】:2020-10-12 17:49:49
【问题描述】:
我正在尝试使用wkhtmltopdf engine 使用CakePdf 3.5.3 呈现pdf,每个页面上都显示自定义文本和页码的html 标题。
https://wkhtmltopdf.org/usage/wkhtmltopdf.txt将该过程描述为传递--header-html命令行参数并使用以下javascript和html:
<!DOCTYPE html>
<html><head><script>
function subst() {
var vars = {};
var query_strings_from_url = document.location.search.substring(1).split('&');
for (var query_string in query_strings_from_url) {
if (query_strings_from_url.hasOwnProperty(query_string)) {
var temp_var = query_strings_from_url[query_string].split('=', 2);
vars[temp_var[0]] = decodeURI(temp_var[1]);
}
}
var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
for (var css_class in css_selector_classes) {
if (css_selector_classes.hasOwnProperty(css_class)) {
var element = document.getElementsByClassName(css_selector_classes[css_class]);
for (var j = 0; j < element.length; ++j) {
element[j].textContent = vars[css_selector_classes[css_class]];
}
}
}
}
</script></head><body style="border:0; margin: 0;" onload="subst()">
<table style="border-bottom: 1px solid black; width: 100%">
<tr>
<td class="section"></td>
<td style="text-align:right">
Page <span class="page"></span> of <span class="topage"></span>
</td>
</tr>
</table>
</body></html>
我创建了src/Template/Layout/pdf/default.ctp 和src/Template/Layout/pdf/header.ctp
default.ctp
<!DOCTYPE html>
<html lang="en">
<head>
<?= $this->Html->charset() ?>
<title>
<?= $this->fetch('title') ?>
</title>
<?= $this->Html->meta('icon') ?>
</head>
<body>
<?= $this->Flash->render() ?>
<div>
<?= $this->fetch('content') ?>
</div>
</body>
</html>
header.ctp
<!DOCTYPE html>
<html lang="en">
<head>
<script>
function subst() {
var vars = {};
var query_strings_from_url = document.location.search.substring(1).split('&');
for (var query_string in query_strings_from_url) {
if (query_strings_from_url.hasOwnProperty(query_string)) {
var temp_var = query_strings_from_url[query_string].split('=', 2);
vars[temp_var[0]] = decodeURI(temp_var[1]);
}
}
var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
for (var css_class in css_selector_classes) {
if (css_selector_classes.hasOwnProperty(css_class)) {
var element = document.getElementsByClassName(css_selector_classes[css_class]);
for (var j = 0; j < element.length; ++j) {
element[j].textContent = vars[css_selector_classes[css_class]];
}
}
}
}
</script>
<title></title>
</head>
<body onload="subst()">
<?= $some_view_variable ?>
Page <span class="page"></span> of <span class="topage"></span>
</body>
</html>
这就是我在控制器中配置 CakePdf 的方式。
Configure::write('CakePdf', [
'engine' => [
'className' => 'CakePdf.WkHtmlToPdf',
'binary' => "/usr/local/bin/wkhtmltopdf",
'options' => [
'header-html' => APP . 'Template' . DS . 'Layout' . DS . 'pdf' . DS . 'header.ctp',
],
],
'margin' => [
'bottom' => 0,
'left' => 0,
'right' => 0,
'top' => 0
],
'pageSize' => 'Letter',
'orientation' => 'portrait'
]);
生成的 PDF 中不显示标题信息。我也不确定如何将 viewVars 传递给标题模板。
【问题讨论】:
标签: cakephp wkhtmltopdf