【问题标题】:How to get page number on dompdf PDF when using "view"使用“查看”时如何获取 dompdf PDF 的页码
【发布时间】:2013-11-27 19:33:39
【问题描述】:

好的,所以我使用以下 sn-p 来获取 HTML 的“视图”,其中 PHP 变量以 $data 加载,这样我就可以执行诸如从数据库调用中填写 tr 的数据之类的事情随便。

function getView ($file, $data=NULL) {
    if (!empty($data)) extract($data);
    ob_start();
    if (is_file($file)) include($file);
    return ob_get_clean();
}

用于类似 $htmlPDF = getView('receipt.php', array( 'orderNumber' => $orderNumber )); 的地方,然后在 HTML 中使用 $orderNumber 来填充它的适当位置。例如:

<h1>You Order #<?= $orderNumber; ?></h1>


好的,重点是,这就是我获取 HTML 的方式。然后我将它加载到我的 dompdf 变量中:
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();

这一切都很好。问题是让inline php 脚本工作以获取页码/页眉|页脚。我已尽我所能遵循here 的指示,但我似乎无法做出正确的混合。到目前为止,没有任何错误,除了我在任何地方都得到 0 页码!

是的,我查看了 Header in PDF page using DOMPDF in PHPdompdf page number 之类的页面,但仍然没有任何进展!我想知道inline php 脚本是否与我如何将HTML 作为字符串获取有关?有什么指示、想法、建议吗?

【问题讨论】:

    标签: php pdf dompdf


    【解决方案1】:

    对我有用的代码。您可以根据 PDF 的大小自定义应位于的位置:

    $pdf->loadView('your_view', $data);
    $pdf->output();
    $dom_pdf = $pdf->getDomPDF();
    
    $canvas = $dom_pdf->get_canvas();
    $canvas->page_text(0, 0, "{PAGE_NUM} of {PAGE_COUNT}", null, 10, array(0, 0, 0));
    

    请记住,颜色数组不包含 RGB 值。您可以从 RYB 行 here 中获取适当的值作为 (0,1) 范围内的值,即 array(0.46,0.46,0.46)

    【讨论】:

      【解决方案2】:

      考虑到Dennis Amelinganswer 的改进版本...

      翻译和文本居中

      不要忘记启用PHP support 这样$dompdf-&gt;set_option("isPhpEnabled", true); (或者,如果您使用的是 laravel-dompdf PDF::setOptions(['isPhpEnabled' =&gt; true]);)。

      <script type="text/php">
          if (isset($pdf)) {
              $pdf->page_script('
                  $text = sprintf(_("Page %d/%d"),  $PAGE_NUM, $PAGE_COUNT);
                  // Uncomment the following line if you use a Laravel-based i18n
                  //$text = __("Page :pageNum/:pageCount", ["pageNum" => $PAGE_NUM, "pageCount" => $PAGE_COUNT]);
                  $font = null;
                  $size = 9;
                  $color = array(0,0,0);
                  $word_space = 0.0;  //  default
                  $char_space = 0.0;  //  default
                  $angle = 0.0;   //  default
      
                  // Compute text width to center correctly
                  $textWidth = $fontMetrics->getTextWidth($text, $font, $size);
      
                  $x = ($pdf->get_width() - $textWidth) / 2;
                  $y = $pdf->get_height() - 35;
      
                  $pdf->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
              '); // End of page_script
          }
      </script>
      

      但是

      如果您只需要 $pageNum,using a CSS counter 是一种更简单的方法!

      【讨论】:

        【解决方案3】:

        我有一个简单的代码可以在 dom pdf 的每一页的页脚中显示页码

        #footer { position: fixed; right: 0px; bottom: 10px; text-align: center;border-top: 1px solid black;}
                #footer .page:after { content: counter(page, decimal); }
         @page { margin: 20px 30px 40px 50px; }
        

        以上代码为css代码

        <div id="footer">
            <p class="page">Page </p>
          </div> 
        

        您可以根据需要更改文本位置

        【讨论】:

        • 嗨 kishan 可能会隐藏 bcz 的边距根据您的页面内容更改您的边距
        【解决方案4】:

        更新关于changes 版本为dompdf >= 0.7.0
        1.因为 dompdf_config.inc.php 文件已从此版本中删除(并且不再引用),所有 dompdf 选项都应在运行时设置。
        4. FontMetrics 类现在被实例化而不是静态的。为了简化从早期版本的 dompdf 迁移嵌入式脚本,我们通过 $fontMetrics 变量提供对实例化 FontMetrics 类的访问。请更新您的嵌入式脚本。例如,FontMetrics::get_font('helvetica') 现在是 $fontMetrics->getFont('helvetica')。
        ~ 感谢Dennis Amelinganswer 提供更新信息。

        通过查看dompdf_config.inc.php 文件找到了我的答案。事实证明,DOMPDF_ENABLE_PHP 设置为false,从而导致内联 php 脚本被忽略。我只是将dompdf_config.custom.inc.php 编辑为以下内容,一切都很好,并且可以使用view 中的后续代码。

        罢工>

        在 dompdf/dompdf_config.custom.inc.php 中

        <?php
            define("DOMPDF_ENABLE_PHP", true);
        

        在运行时

        $dompdf->set_option("isPhpEnabled", true);
        

        然后,在我的 html 文件中

        <body>
            <script type="text/php">
                if ( isset($pdf) ) {
                    // OLD 
                    // $font = Font_Metrics::get_font("helvetica", "bold");
                    // $pdf->page_text(72, 18, "{PAGE_NUM} of {PAGE_COUNT}", $font, 6, array(255,0,0));
                    // v.0.7.0 and greater
                    $x = 72;
                    $y = 18;
                    $text = "{PAGE_NUM} of {PAGE_COUNT}";
                    $font = $fontMetrics->get_font("helvetica", "bold");
                    $size = 6;
                    $color = array(255,0,0);
                    $word_space = 0.0;  //  default
                    $char_space = 0.0;  //  default
                    $angle = 0.0;   //  default
                    $pdf->page_text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
                }
            </script>
            <div
        

        走这条路别忘了重启Apache

        【讨论】:

        • 使用&lt;script&gt; 标签而不是常规的&lt;?php ?&gt; 标签非常重要。常规标签被忽略。
        【解决方案5】:

        如果您使用 DOMPDF >= 0.7.0,则 dompdf_config.inc.php 文件 has been removed 并添加页码现在需要稍微不同的方法:

        由于 dompdf_config.inc.php 文件已从此版本中删除(并且不再引用),所有 dompdf 选项都应在运行时设置。

        要让 DOMPDF 执行 PHP 代码,请使用:

        $dompdf->set_option("isPhpEnabled", true);
        

        另外,FontMetrics should now be called 使用$fontMetrics 而不是Font_Metrics,所以@user1231342435346354 提到的代码略有变化:

        <script type="text/php">
        if ( isset($pdf) ) { 
            $pdf->page_script('
                if ($PAGE_COUNT > 1) {
                    $font = $fontMetrics->get_font("Arial, Helvetica, sans-serif", "normal");
                    $size = 12;
                    $pageText = "Page " . $PAGE_NUM . " of " . $PAGE_COUNT;
                    $y = 15;
                    $x = 520;
                    $pdf->text($x, $y, $pageText, $font, $size);
                } 
            ');
        }
        </script>
        

        【讨论】:

        • 现在这是设置选项的首选方式:$options = new Options(); $options->set('isPhpEnabled', TRUE); $dompdf = new Dompdf($options);
        • 这是在通过大约 7-8 页的 stackoverflow 后唯一对我有用的解决方案。如果您使用的是 0.7+ 版本,这是可行的方法。
        • 此代码正确添加了页码,但它也添加了一个空白页作为第一页。您知道如何删除该空白页面吗?
        • 知道为什么会出现这个错误吗? Object of class Barryvdh\DomPDF\PDF could not be converted to string?在脚本内的行上检查是否设置了 $pdf。谢谢
        【解决方案6】:

        首先您必须在dompdf_config.inc.php 文件中启用执行内联php 脚本。 (将define("DOMPDF_ENABLE_PHP", true);这一行改为true)

        此代码在页眉的右上角设置页面指示符...

            <script type="text/php">
            if ( isset($pdf) ) { 
                $pdf->page_script('
                    if ($PAGE_COUNT > 1) {
                        $font = Font_Metrics::get_font("Arial, Helvetica, sans-serif", "normal");
                        $size = 12;
                        $pageText = Page . " " . $PAGE_NUM . " of " . $PAGE_COUNT;
                        $y = 15;
                        $x = 520;
                        $pdf->text($x, $y, $pageText, $font, $size);
                    } 
                ');
            }
        </script> 
        

        确保脚本标签在正文标签内...否则不起作用!

        【讨论】:

        • 不要复制粘贴别人的答案
        猜你喜欢
        • 2014-07-31
        • 1970-01-01
        • 2014-09-05
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        相关资源
        最近更新 更多