【问题标题】:Header in PDF page using DOMPDF in PHP在 PHP 中使用 DOMPDF 在 PDF 页面中的标题
【发布时间】:2011-11-21 00:13:50
【问题描述】:

我正在使用 DOMPDF 创建 PDF 文件。我有大量内容要提取为 PDF,我们需要在所有页面中添加一些标题。那么任何人都可以告诉我如何在 PDF 中添加页眉和页脚,以便页眉将显示在所有使用 DOMPDF 的页面中。

【问题讨论】:

    标签: php pdf-generation 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);
    

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2011-12-12
      • 2017-06-25
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多