在 PHP 中使用 DOMPDF 在 PDF 页面中的标题
Posted
技术标签:
【中文标题】在 PHP 中使用 DOMPDF 在 PDF 页面中的标题【英文标题】:Header in PDF page using DOMPDF in PHP 【发布时间】:2011-11-21 00:13:50 【问题描述】:我正在使用 DOMPDF 创建 PDF 文件。我有大量内容要提取为 PDF,我们需要在所有页面中添加一些标题。那么任何人都可以告诉我如何在 PDF 中添加页眉和页脚,以便页眉将显示在所有使用 DOMPDF 的页面中。
【问题讨论】:
【参考方案1】:在 0.6.0 代码中,您将能够使用 html+CSS 生成页眉和页脚。与使用内联 php 相比存在一些限制(例如,还没有 PAGE_COUNT 占位符),因此这是否可行取决于您的需求。
以下代码将生成two-page document with a header and footer:
<html>
<head>
<style>
@page margin: 180px 50px;
#header position: fixed; left: 0px; top: -180px; right: 0px; height: 150px; background-color: orange; text-align: center;
#footer position: fixed; left: 0px; bottom: -180px; right: 0px; height: 150px; background-color: lightblue;
#footer .page:after content: counter(page, upper-roman);
</style>
<body>
<div id="header">
<h1>Widgets Express</h1>
</div>
<div id="footer">
<p class="page">Page </p>
</div>
<div id="content">
<p>the first page</p>
<p style="page-break-before: always;">the second page</p>
</div>
</body>
</html>
如果您需要访问一些缺失的功能,您也可以使用这两种样式的组合。使用 page_text
方法添加的 PDF 对象和文本呈现在 HTML 内容之上。
【讨论】:
嗨,Brian.. 为您的精彩教程加 1。你让它变得很容易:) @BrianS dompdf 是否尊重页面计数器?我无法让它工作。这就是我要说的content: counter(page) " of " counter(pages);
@Pzanno dompdf 目前无法以这种方式显示总页数。访问此信息的唯一方法是通过内联脚本。
用这个救了我的命...只需要在每个页面上都有一个徽标。
重要提示:将页眉和页脚放在代码的开头将在每一页上打印它们。将它们放在最后将省略第一页上的页眉和页脚。页眉和页脚标签也需要是正文的直接子代。来源:agoradesign.at/blog/…【参考方案2】:
DOMPDF wiki 上有一个常见问题解答条目:有没有办法添加页眉和页脚或页码?。
因此,您可以将以下“内联 PHP”-sn-p 添加到您的 HTML 输入中(为您的页脚添加类似的 page_text
-call):
<script type="text/php">
if ( isset($pdf) )
$font = Font_Metrics::get_font("helvetica", "bold");
$pdf->page_text(72, 18, "Header: PAGE_NUM of PAGE_COUNT",
$font, 6, array(0,0,0));
</script>
如果您想在调用方(直接在 PHP 代码中)实现此功能,则必须调用 DOMPDFS 的 get_canvas()
- 方法,该方法返回底层 PDF 渲染器,允许您调用 page_text
方法如上例。让我告诉你我的意思:
// your dompdf setup
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
// add the header
$canvas = $dompdf->get_canvas();
$font = Font_Metrics::get_font("helvetica", "bold");
// the same call as in my previous example
$canvas->page_text(72, 18, "Header: PAGE_NUM of PAGE_COUNT",
$font, 6, array(0,0,0));
最终你必须在load_html
之后调用page_text
(试试看)。
【讨论】:
谢谢 vstm... 我正在尝试在标题中打印一些 html 标签。我也尝试过 TCPDF .. 但我不能使用 HTML 标签,它只支持文本。在我的要求中,我必须创建一个报告,并且报告标题或列名应该显示在所有页面中。我找不到任何在 PDF 中打印我的 HTML 标题的东西。如果你知道什么,请帮助我。 你的第二部分代码更好,没有内联脚本php代码。但是“//添加标题”部分必须在“$dompdf->render();”之后为了工作。 您应该启用 'DOMPDF_ENABLE_PHP' 以使该答案的第一部分正常工作,这是一个真正的安全风险。您不能将其用于外部网站或用户生成的 html。使用用户生成的内容时,您应该 100% 确保在启用此选项之前所有内容都已正确转义。 调试我发现 $canvas = null In 0.7.0 Font_Metrics 现在在 dompdf 对象$font = $dompdf->getFontMetrics()->get_font("helvetica", "bold");
中可用【参考方案3】:
如果你想得到类似的东西:
定义如下,你的文档的页眉、页脚和内容:
<html>
<head>
<style>
@page
margin: 100px 25px;
header
position: fixed;
top: -60px;
height: 50px;
background-color: #752727;
color: white;
text-align: center;
line-height: 35px;
footer
position: fixed;
bottom: -60px;
height: 50px;
background-color: #752727;
color: white;
text-align: center;
line-height: 35px;
</style>
</head>
<body>
<header>
Header
</header>
<footer>
Footer
</footer>
<main>
<!-- Your main content -->
</main>
</body>
</html>
【讨论】:
不要以为这会为每一页添加页眉和页脚,对吗?如果内容跨越两页,我认为第二页将没有页眉和页脚。 ? 它会添加到每一页。 谢谢!很难相信,但今天我试了一下,发现它有效。 :-) 对于任何想知道该版本的人,我使用的是 1.0.2。【参考方案4】:你需要这个代码,希望对你有帮助
问候...
# Instanciamos un objeto de la clase DOMPDF.
$dompdf = new DOMPDF();
# Definimos el tamaño y orientación del papel que queremos.
# O por defecto cogerá el que está en el fichero de configuración.
$dompdf->set_paper("Letter", "portrait");
# Cargamos el contenido HTML.
$dompdf->load_html(utf8_decode($html));
# Renderizamos el documento PDF.
$dompdf->render();
#Esto es lo que imprime en el PDF el numero de paginas
$canvas = $dompdf->get_canvas();
$footer = $canvas->open_object();
$w = $canvas->get_width();
$h = $canvas->get_height();
$canvas->page_text($w-60,$h-28,"Página PAGE_NUM de PAGE_COUNT", Font_Metrics::get_font('helvetica'),6);
$canvas->page_text($w-590,$h-28,"El pie de página del lado izquiero, Guadalajara, Jalisco C.P. XXXXX Tel. XX (XX) XXXX XXXX", Font_Metrics::get_font('helvetica'),6);
$canvas->close_object();
$canvas->add_object($footer,"all");
# Enviamos el fichero PDF al navegador.
//$dompdf->stream('FicheroEjemplo.pdf');
# Para grabar en fichero en ruta especifica
$output = $dompdf->output();
file_put_contents('ejemplo.pdf',$output);
#Liberamos
unset($dompdf);
【讨论】:
以上是关于在 PHP 中使用 DOMPDF 在 PDF 页面中的标题的主要内容,如果未能解决你的问题,请参考以下文章