在 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-&gt;getFontMetrics()-&gt;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&aacute;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 页面中的标题的主要内容,如果未能解决你的问题,请参考以下文章

php   dompdf包如何将HTML页面导出中文无乱码的PDF文档

使用 PHP+DomPDF 生成缓慢的 PDF

使用 dompdf 生成 pdf 时的背景位置数组

DOMPDF为整个页面设置字体?

CSS 不适用于 DOMPDF

PHP:使用 DOMPDF 自动将动态 PDF 保存到远程服务器