'How to get page number on dompdf PDF when using "view"
Ok, so I use the following snippet to get "views" of HTML with PHP variables loaded in as $data
so that I can do things like fill in tr
's of data from a database call or whatever.
function getView ($file, $data=NULL) {
if (!empty($data)) extract($data);
ob_start();
if (is_file($file)) include($file);
return ob_get_clean();
}
Gets used for something like, $htmlPDF = getView('receipt.php', array( 'orderNumber' => $orderNumber ));
Where $orderNumber
is then used in the HTML to fill in it's proper places. For instance something like:
<h1>You Order #<?= $orderNumber; ?></h1>
Ok, so point is, that's how I get my HTML. I then load it to my dompdf variable as:
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
Which all works great. The problem is getting the inline php
script to work to get PAge Numbers / Page Headers|Footers. I've followed the directions here best I can, but I can't seem to make the right blend. Thus far, not having any errors, except I get 0 Page Numbers anywhere!
And yes I've looked at pages like Header in PDF page using DOMPDF in PHP and dompdf page number, but still no forward progress, at all! I'm wondering if the inline php
scripting has to do with how I'm getting the HTML as a string? Any pointers, ideas, advice?
Solution 1:[1]
Update Regarding changes with version of
dompdf
>=0.7.0
1. Because the dompdf_config.inc.php file has been removed from this release (and is no longer referenced) all dompdf options should be set at run time.
4. The FontMetrics class is now instantiated instead of static. To simplify migration of embedded scripts from earlier versions of dompdf we provide access to the instantiated FontMetrics class via the $fontMetrics variable. Please update your embedded scripts. For example, FontMetrics::get_font('helvetica') would now be $fontMetrics->getFont('helvetica').
~ Thanks to Dennis Ameling's answer for the updated information.
Found my answer by looking over the dompdf_config.inc.php
file. As it turns out, DOMPDF_ENABLE_PHP
is set to false
thus causing the inline php script to be ignored. I simply edited dompdf_config.custom.inc.php
to the following and all is fine and working with the later code in the view
.
In dompdf/dompdf_config.custom.inc.php
<?php
define("DOMPDF_ENABLE_PHP", true);
At Run Time
$dompdf->set_option("isPhpEnabled", true);
Then, in my html file
<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
If you go this route, don't forget to restart Apache
Solution 2:[2]
If you're using DOMPDF >= 0.7.0, the dompdf_config.inc.php file has been removed and adding a page number now requires a slightly different approach:
Because the dompdf_config.inc.php file has been removed from this release (and is no longer referenced) all dompdf options should be set at run time.
To enable PHP code to be executed by DOMPDF, use:
$dompdf->set_option("isPhpEnabled", true);
Also, FontMetrics should now be called by using $fontMetrics
instead of Font_Metrics
, so the code mentioned by @user1231342435346354 changes slightly:
<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>
Solution 3:[3]
I have a simple code to showing page number in footer of every page of 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; }
above code is css code
<div id="footer">
<p class="page">Page </p>
</div>
You can change text position according to your requirement
Solution 4:[4]
Improved version of Dennis Ameling's answer to take into account…
Translation and text centering
Do not forget to enable PHP support like this $dompdf->set_option("isPhpEnabled", true);
(or, if you're using 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>
But
If you only need $pageNum, using a CSS counter is a way simpler approach!
Solution 5:[5]
Code that worked for me. You can customize where is should be located depending on the size of your 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));
Remember that color array doesn't contain RGB values. Appropriate values you can take from row RYB here as a value in range (0,1), i.e. array(0.46,0.46,0.46)
.
Solution 6:[6]
Easy Method: Using CSS and dompdf Add Page numbers like 1 of 5. you can add pdf page numbers using CSS and specify the Header or Footer tag in the content.
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']);
}
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Community |
Solution 2 | |
Solution 3 | Sumit Kumar Gupta |
Solution 4 | Community |
Solution 5 | |
Solution 6 |