# dompdf加入浮水印與頁碼
###### tags: `PHP`,`dompdf`,`浮水印`,`頁碼`
## 需求
加入浮水印,
浮水印圖片要置中,
從第二位開始加入頁碼
發現一篇文章,
[Dompdf Create Watermark and Page Numbers](https://www.codesenior.com/en/tutorial/Dompdf--Create-Watermark-and-Page-Numbers)
大多功能已實現,
將會以此來修改成我要的
## 經驗談與問題
- dompdf設定要注意先後順序
- page_text()方法適用於所有頁面,但請注意頁面從零開始。
- 如果你想忽略第一頁,你應該使用æ ,$canvas->page_script() 方法。
- 如上例所示,$PAGE_NUM可通過page_script()方法訪問變量。
- set_opacity() 方法具有第二個參數,用於將不透明度應用於所有頁面或單個頁面。
- $canvas->image('圖片位置', x,y,w,h) 不明原因首次顯示會在第三頁??
## 最終版
經過多次修改後的最後版本,
完美符合我要的浮水印與頁碼,
```php=
$dompdf = new Dompdf();
$options =$dompdf->getOptions();
$options->setIsPhpEnabled(true);
$options->setIsRemoteEnabled(true);
// $options->setIsHtml5ParserEnabled(true);
$dompdf->setOptions($options);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', '');
$dompdf->render();
// Instantiate canvas instance
$canvas = $dompdf->getCanvas();
$canvas->set_opacity(.3,'Multiply'); // 初始透明度
$w = $canvas->get_width();
$h = $canvas->get_height();
// 圖片浮水印參數
$watermarkImg = 'lightedu1-min.png';
$watermarkSize = 500;
$watermarkX = ($w - $watermarkSize)/2;
$watermarkY = ($h - $watermarkSize)/2;
// 頁面script
$canvas->page_script('
if ($PAGE_NUM > 1) {
// 頁碼
$current_page = $PAGE_NUM-1;
$font = $fontMetrics->getFont("times", "normal");
$pdf->set_opacity(1,"Multiply"); // 頁碼不需要透明度,暫時不透明
$pdf->text(297.64, 791.89, "$current_page", $font, 10, array(0,0,0));
}
if ($PAGE_NUM >= 1) {
// 浮水印
$watermarkImage="'.$watermarkImg.'";
$watermarkX='.$watermarkX.';
$watermarkY='.$watermarkY.';
$watermarkSize="'.$watermarkSize.'";
$pdf->set_opacity(0.5,"Multiply");
$pdf->image($watermarkImage , $watermarkX , $watermarkY, $watermarkSize, $watermarkSize);
}'
);
file_put_contents('test.pdf', $dompdf->output());
```
## 編輯細節
### 原始範例
[Dompdf Create Watermark and Page Numbers](https://www.codesenior.com/en/tutorial/Dompdf--Create-Watermark-and-Page-Numbers)
已實現
插入文字浮水印
插入圖片
加入頁碼
```php=
use Dompdf\Dompdf;
use Dompdf\FontMetrics;
use Dompdf\Options;
$options = new Options();
$options->set('isPhpEnabled', 'true');
$dompdf = new Dompdf($options);
$dompdf->setOptions($options);
$dompdf->loadHtml('<html>....');
$dompdf->setPaper('A4', '');
$dompdf->render();
// Instantiate canvas instance
$canvas = $dompdf->getCanvas();
$w = $canvas->get_width();
$h = $canvas->get_height();
$pageNumberWidth = $w / 2;
$pageNumberHeight = $h - 50;
$GLOBALS["logo1"]=public_path('images/logo/icon.png');
$GLOBALS["logo2"]=public_path('images/logo/kultur_logo.png');
$canvas->page_script('
if ($PAGE_NUM > 1) {
$current_page = $PAGE_NUM-1;
$total_pages = $PAGE_COUNT-1;
$font = $fontMetrics->getFont("times", "normal");
$pdf->set_opacity(1,"Multiply");
$pdf->text(297.64, 791.89, "$current_page / $total_pages", $font, 10, array(0,0,0));
$pdf->set_opacity(0.2,"Multiply");
$pdf->image($GLOBALS["logo1"], 475.28, 771.89, 50, 50);
$pdf->image($GLOBALS["logo2"], 75.28, 771.89, 50, 50);
}
');
$canvas->set_opacity(.1,'Multiply');//Multiply means apply to all pages.
// Specify watermark text
$text = "http://www.codesenior.com";
// Instantiate font metrics class
$fontMetrics = new FontMetrics($canvas, $options);
$font = $fontMetrics->getFont('times');
$txtHeight = $fontMetrics->getFontHeight($font, 150);
$textWidth = $fontMetrics->getTextWidth($text, $font, 40);
$x = (($w-$textWidth)/2);
$y = (($h-$txtHeight)/2);
//page_text method applies text to all pages.
$canvas->page_text($x, $y, $text, $font, 40,$color = array(255,0,0),
$word_space = 0.0, $char_space = 0.0, $angle = 20.0);
return $dompdf->stream($project->code . '.pdf', array("Attachment" => 0));
```
### 改版1
參考原本改成我需要的
但遇到一個問題
文字浮水印可以從第一頁就出現
但圖片浮水印卻從第三頁開始出現
若拿掉頁碼那段反而會從第四頁開始出現
那麼只好把圖片浮水印放到page_script中
見改版2
```php=
use Dompdf\Dompdf;
use Dompdf\FontMetrics;
use Dompdf\Options;
$dompdf = new Dompdf();
$options =$dompdf->getOptions();
$options->setIsPhpEnabled(true);
$options->setIsRemoteEnabled(true);
$options->setIsHtml5ParserEnabled(true);
$dompdf->setOptions($options);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', '');
$dompdf->render();
// Instantiate canvas instance
$canvas = $dompdf->getCanvas();
$w = $canvas->get_width();
$h = $canvas->get_height();
// 頁碼
$pageNumberWidth = $w / 2;
$pageNumberHeight = $h - 50;
$canvas->page_script('
if ($PAGE_NUM > 1) {
$current_page = $PAGE_NUM-1;
$total_pages = $PAGE_COUNT-1;
$font = $fontMetrics->getFont("times", "normal");
$pdf->set_opacity(1,"Multiply"); // 頁碼不需要透明度,暫時不透明
$pdf->text(297.64, 791.89, "$current_page", $font, 10, array(0,0,0));
$pdf->set_opacity(0.3,"Multiply"); // 還原透明度
}
');
// 浮水印
$canvas->set_opacity(.3,'Multiply');
// 文字浮水印
$fontMetrics = new FontMetrics($canvas, $options);
$font = $fontMetrics->getFont("tw-kai", "normal");
$canvas->page_text(0, 0, '文字浮水印', $font, 40,$color = array(255,0,0),
$word_space = 0.0, $char_space = 0.0, $angle = 20.0);
// 圖片浮水印
// $canvas->set_opacity(.5,'Multiply'); // 因為圖片本身就很淡,不要再刷淡太多
$watermarkImg = 'lightedu1-min.png';
$watermarkSize = 500;
$watermarkX = ($w - $watermarkSize)/2;
$watermarkY = ($h - $watermarkSize)/2;
$canvas->image($watermarkImg , $watermarkX , $watermarkY, $watermarkSize, $watermarkSize);
// $canvas->page_text($width/3 , $height/3, $watermark, $font = 'tw-kai', $size = 70, $color = array(0,0,0), $wordSpace = 2, $charSpace = 2);
file_put_contents('test.pdf', $dompdf->output());
$dompdf = new Dompdf();
$options =$dompdf->getOptions();
$options->setIsPhpEnabled(true);
$options->setIsRemoteEnabled(true);
$options->setIsHtml5ParserEnabled(true);
$dompdf->setOptions($options);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', '');
$dompdf->render();
// Instantiate canvas instance
$canvas = $dompdf->getCanvas();
$w = $canvas->get_width();
$h = $canvas->get_height();
// 頁碼
$pageNumberWidth = $w / 2;
$pageNumberHeight = $h - 50;
$canvas->page_script('
if ($PAGE_NUM > 1) {
$current_page = $PAGE_NUM-1;
$total_pages = $PAGE_COUNT-1;
$font = $fontMetrics->getFont("times", "normal");
$pdf->set_opacity(1,"Multiply"); // 頁碼不需要透明度,暫時不透明
$pdf->text(297.64, 791.89, "$current_page", $font, 10, array(0,0,0));
$pdf->set_opacity(0.5,"Multiply"); // 還原透明度
}
');
// 浮水印
$canvas->set_opacity(.5,'Multiply');
// 文字浮水印
$fontMetrics = new FontMetrics($canvas, $options);
$font = $fontMetrics->getFont("tw-kai", "normal");
$watermarkText = '文字浮水印';
$canvas->page_text(0, 0, $watermarkText, $font, 40,$color = array(255,0,0),
$word_space = 0.0, $char_space = 0.0, $angle = 20.0);
// 圖片浮水印
$watermarkImg = 'lightedu1-min.png';
$watermarkSize = 500;
$watermarkX = ($w - $watermarkSize)/2;
$watermarkY = ($h - $watermarkSize)/2;
$canvas->image($watermarkImg , $watermarkX , $watermarkY, $watermarkSize, $watermarkSize);
// $canvas->page_text($width/3 , $height/3, $watermark, $font = 'tw-kai', $size = 70, $color = array(0,0,0), $wordSpace = 2, $charSpace = 2);
file_put_contents('test.pdf', $dompdf->output());
```
### 改版2
```
$dompdf = new Dompdf();
$options =$dompdf->getOptions();
$options->setIsPhpEnabled(true);
$options->setIsRemoteEnabled(true);
$options->setIsHtml5ParserEnabled(true);
$dompdf->setOptions($options);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', '');
$dompdf->render();
// Instantiate canvas instance
$canvas = $dompdf->getCanvas();
$canvas->set_opacity(.3,'Multiply');
$fontMetrics = new FontMetrics($canvas, $options);
$w = $canvas->get_width();
$h = $canvas->get_height();
// 圖片浮水印
$watermarkImg = 'lightedu1-min.png';
$watermarkSize = 500;
$watermarkX = ($w - $watermarkSize)/2;
$watermarkY = ($h - $watermarkSize)/2;
$canvas->image($watermarkImg , $watermarkX , $watermarkY, $watermarkSize, $watermarkSize);
$part_script_watermark = "\$pdf->image('$watermarkImg' , $watermarkX , $watermarkY, $watermarkSize, $watermarkSize);";
// 頁碼
$pageNumberWidth = $w / 2;
$pageNumberHeight = $h - 50;
$part_script_pageNumber =
'if ($PAGE_NUM > 1) {
$current_page = $PAGE_NUM-1;
$total_pages = $PAGE_COUNT-1;
$font = $fontMetrics->getFont("times", "normal");
$pdf->set_opacity(1,"Multiply"); // 頁碼不需要透明度,暫時不透明
$pdf->text(297.64, 791.89, "$current_page", $font, 10, array(0,0,0));
$pdf->set_opacity(0.3,"Multiply"); // 還原透明度
}
';
$canvas->page_script(
$part_script_watermark.
$part_script_pageNumber
);
```
前三頁的浮水印跑道最上層,把所有文字都蓋掉了@@
那跟頁碼一起產生好了...
那就首頁沒有浮水印,
再想是否與`if ($PAGE_NUM > 1)`有關係
### 改版3
將浮水印的條建設為頁大於等於0才產生`if ($PAGE_NUM >= 0)`
```php=
$dompdf = new Dompdf();
$options =$dompdf->getOptions();
$options->setIsPhpEnabled(true);
$options->setIsRemoteEnabled(true);
$options->setIsHtml5ParserEnabled(true);
$dompdf->setOptions($options);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', '');
$dompdf->render();
// Instantiate canvas instance
$canvas = $dompdf->getCanvas();
$canvas->set_opacity(.3,'Multiply');
$fontMetrics = new FontMetrics($canvas, $options);
$w = $canvas->get_width();
$h = $canvas->get_height();
// 圖片浮水印
$watermarkImg = 'lightedu1-min.png';
$watermarkSize = 500;
$watermarkX = ($w - $watermarkSize)/2;
$watermarkY = ($h - $watermarkSize)/2;
$part_script_watermark =
'$watermarkX='.$watermarkX.';'.
'$watermarkY='.$watermarkY.';'.
'$watermarkSize="'.$watermarkSize.'";'.
'if ($PAGE_NUM > 0) {
$pdf->set_opacity(0.5,"Multiply");
$pdf->image("lightedu1-min.png" , $watermarkX , $watermarkY, $watermarkSize, $watermarkSize);
}
';
// 頁碼
$part_script_pageNumber =
'if ($PAGE_NUM > 1) {
$current_page = $PAGE_NUM-1;
$total_pages = $PAGE_COUNT-1;
$font = $fontMetrics->getFont("times", "normal");
$pdf->set_opacity(1,"Multiply"); // 頁碼不需要透明度,暫時不透明
$pdf->text(297.64, 791.89, "$current_page", $font, 10, array(0,0,0));
}
';
// 頁面script
$canvas->page_script(
$part_script_watermark.
$part_script_pageNumber
);
file_put_contents('test.pdf', $dompdf->output());
```
程式看起來沒問題,
但第二頁(顯示頁碼的第一頁)的浮水印蓋過文字...
其他都正常...
那我全部放一起好了