使用“查看”时如何在 dompdf PDF 上获取页码

问题描述 投票:0回答:8

好的,所以我使用以下代码片段获取 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 页码!

是的,我已经在 PHP 中使用 DOMPDF 看过 Header in PDF 页面dompdf page number,但仍然没有任何进展!我想知道

inline php
脚本是否与我如何将HTML作为字符串获取有关?有任何指示、想法、建议吗?

php pdf dompdf
8个回答
18
投票

更新关于变化与版本

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


16
投票

如果您使用的是 DOMPDF >= 0.7.0,dompdf_config.inc.php 文件已被删除并且添加页码现在需要稍微不同的方法:

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

要使 PHP 代码能够被 DOMPDF 执行,请使用:

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

此外,FontMetrics 现在应该使用$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>

13
投票

我有一个简单的代码可以在 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> 

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


4
投票

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

翻译和文本居中

不要忘记像这样启用PHP支持

$dompdf->set_option("isPhpEnabled", true);
(或者,如果您使用的是 laravel-dompdf
PDF::setOptions(['isPhpEnabled' => 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,使用 CSS 计数器 是一种更简单的方法!


4
投票

对我有用的代码。您可以根据 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
投票

适合我的代码!

  1. 对于 Laravel,如果您正在使用 barryvdh / laravel-dompdf(我用过),

在以下文件中更改

"enable_php" => true,

 vendor/barryvdh/laravel-dompdf/config/dompdf.php
  1. 在为 PDF 添加 HTML 代码的刀片中添加以下脚本代码。
    <script type="text/php"> 
    
    if (isset($pdf)) { 
     //Shows number center-bottom of A4 page with $x,$y values
        $x = 250;  //X-axis i.e. vertical position 
        $y = 820; //Y-axis horizontal position
        $text = "Page {PAGE_NUM} of {PAGE_COUNT}";  //format of display message
        $font =  $fontMetrics->get_font("helvetica", "bold");
        $size = 10;
        $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> 

希望它对某人有用!


0
投票

简单方法:使用 CSS 和 dompdf 添加页码,例如第 1 页,共 5 页。 您可以使用 CSS 添加 pdf 页码并在内容中指定页眉或页脚标签。

 function injectPageCount(Dompdf $dompdf): void{
            /** @var CPDF $canvas */
            $canvas = $dompdf->getCanvas();
            $pdf = $canvas->get_cpdf();
            foreach ($pdf->objects as &$o) {
                if ($o['t'] === 'contents') {
                    $o['c'] = str_replace('DOMPDF_PAGE_COUNT_PLACEHOLDER', $canvas->get_page_count(), $o['c']);
                }
            }
        }

0
投票

尽管这已经很老了,希望作者到那时能成功,但这些解决方案都不适用于 dompdf 版本 2。所以这就是有效的方法,如果这对落在这个问题上的人有任何帮助的话谷歌搜索后的页面:

<?php
use Dompdf\Dompdf;
use Dompdf\Options;

$options = new Options;
$options->set('isPhpEnabled', 'true'); // allow php code in html

$dompdf = new Dompdf($options);
$dompdf->setPaper("A4", "portrait");
$html = file_get_contents("dompdf-template.php"); // import html template

$contract_nb = '3974G3U33E';
$name = 'john';
$table_lines = ''; // if the table is too long to fit in one page, some blank space will be added before the table starts, so instead, we create one table per line.
for ($i = 0; $i < 120; $i++) // loop many times the same line just to create some content
{
    $table_lines .= '<table>';
        $table_lines .= '<tbody>';
            $table_lines .= '<tr>';
                $table_lines .= '<td>A sample product</td>';
                $table_lines .= '<td style="text-align: right;">' . $i . '</td>';
            $table_lines .= '</tr>';
        $table_lines .= '</tbody>';
    $table_lines .= '</table>';
}
// replace some values in the html template
$html = str_replace(['{contract_nb}', '{name}', '{table_lines}'], [$contract_nb, $name, $table_lines], $html);
$dompdf->loadHtml($html);

$dompdf->render(); // we render the pdf so the number of pages can be calculated

// add pagination
$canvas = $dompdf->getCanvas(); // get the canvas
// add the page number and total number of pages
$canvas->page_script('
    $text = "$PAGE_NUM / $PAGE_COUNT";
    $pdf->text(535, 791.89, $text, \'Helvetica\', 10, array(0,0,0));
');

$dompdf->stream('generated-file-' . time() . '.pdf', ['Attachment' => 0]);
?>

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.