5 个答案:

答案 0 :(得分:10)

使用FPDF和FPDI类只是一个快速的例子:

function PlaceWatermark($file, $text, $xxx, $yyy, $op, $outdir) {

require_once('fpdf.php');

require_once('fpdi.php');

$name = uniqid();

$font_size = 5;

$ts=explode("\n",$text);

$width=0;

foreach ($ts as $k=>$string) {

$width=max($width,strlen($string));

}

$width = imagefontwidth($font_size)*$width;

$height = imagefontheight($font_size)*count($ts);

$el=imagefontheight($font_size);

$em=imagefontwidth($font_size);

$img = imagecreatetruecolor($width,$height);

// Background color

$bg = imagecolorallocate($img, 255, 255, 255);

imagefilledrectangle($img, 0, 0,$width ,$height , $bg);

// Font color

$color = imagecolorallocate($img, 0, 0, 0);

foreach ($ts as $k=>$string) {

$len = strlen($string);

$ypos = 0;

for($i=0;$i

$xpos = $i * $em;

$ypos = $k * $el;

imagechar($img, $font_size, $xpos, $ypos, $string, $color);

$string = substr($string, 1);

}

}

imagecolortransparent($img, $bg);

$blank = imagecreatetruecolor($width, $height);

$tbg = imagecolorallocate($blank, 255, 255, 255);

imagefilledrectangle($blank, 0, 0,$width ,$height , $tbg);

imagecolortransparent($blank, $tbg);

if ( ($op < 0) OR ($op >100) ){

$op = 100;

}

imagecopymerge($blank, $img, 0, 0, 0, 0, $width, $height, $op);

imagepng($blank,$name.".png");

// Created Watermark Image

$pdf = new FPDI();

if (file_exists("./".$file)){

$pagecount = $pdf->setSourceFile($file);

} else {

return FALSE;

}

$tpl = $pdf->importPage(1);

$pdf->addPage();

$pdf->useTemplate($tpl, 1, 1, 0, 0, TRUE);

//Put the watermark

$pdf->Image($name.'.png', $xxx, $yyy, 0, 0, 'png');

if ($outdir === TRUE){

return $pdf->Output();

} else {

return $pdf;

}

}

PlaceWatermark("filename.pdf", "This is a lazy, but still simple test\n This should stand on a new line!", 30, 120, 100,TRUE);

用法:PlaceWatermark($filename, $text, $x, $y, $opacity, $directoutput);

$filename - 要在其中放置水印的PDF路径

$text - 要添加的水印文字

$x - 要在其中放置水印的x坐标

$y - 您想要放置水印的坐标

$opacity - 文字的不透明度

$directoutput - 如果TRUE函数将输出PDF文件,否则它将返回$ pdf

正如我已经说过的,这是一个非常快速和肮脏的例子,它需要一些改进。

答案 1 :(得分:6)

对于偶然发现此帖子的其他人,您可以使用for循环生成更多页面

for($i=1; $i <= $pagecount; $i++) {

$tpl = $pdf->importPage($i);

$pdf->addPage();

$pdf->useTemplate($tpl, 1, 1, 0, 0, TRUE);

//Put the watermark

$pdf->Image($name.'.png', $xxx, $yyy, 0, 0, 'png');}

答案 2 :(得分:1)

/* index.php */

require('rotation.php');

class PDF extends PDF_Rotate{

protected $_outerText1;// dynamic text

protected $_outerText2;

function setWaterText($txt1="", $txt2=""){

$this->_outerText1 = $txt1;

$this->_outerText2 = $txt2;

}

function Header(){

//Put the watermark

$this->SetFont('Arial','B',40);

$this->SetTextColor(255,192,203);

$this->SetAlpha(0.5);

$this->RotatedText(35,190, $this->_outerText1, 45);

$this->RotatedText(75,190, $this->_outerText2, 45);

}

function RotatedText($x, $y, $txt, $angle){

//Text rotated around its origin

$this->Rotate($angle,$x,$y);

$this->Text($x,$y,$txt);

$this->Rotate(0);

}

}

$file = "path/filename.pdf";// path: file name

$pdf = new PDF();

if (file_exists($file)){

$pagecount = $pdf->setSourceFile($file);

} else {

return FALSE;

}

$pdf->setWaterText("w a t e r M a r k d e m o ", "s e c o n d L i n e o f t e x t");

/* loop for multipage pdf */

for($i=1; $i <= $pagecount; $i++) {

$tpl = $pdf->importPage($i);

$pdf->addPage();

$pdf->useTemplate($tpl, 1, 1, 0, 0, TRUE);

}

$pdf->Output(); //specify path filename to save or keep as it is to view in browser

/* rotation.php */

require('fpdf.php');

require('fpdi.php');

class PDF_Rotate extends FPDI

{

var $angle=0;

var $extgstates = array();

function Rotate($angle,$x=-1,$y=-1)

{

if($x==-1)

$x=$this->x;

if($y==-1)

$y=$this->y;

if($this->angle!=0)

$this->_out('Q');

$this->angle=$angle;

if($angle!=0)

{

$angle*=M_PI/180;

$c=cos($angle);

$s=sin($angle);

$cx=$x*$this->k;

$cy=($this->h-$y)*$this->k;

$this->_out(sprintf('q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy));

}

}

function _endpage()

{

if($this->angle!=0)

{

$this->angle=0;

$this->_out('Q');

}

parent::_endpage();

}

function SetAlpha($alpha, $bm='Normal')

{

// set alpha for stroking (CA) and non-stroking (ca) operations

$gs = $this->AddExtGState(array('ca'=>$alpha, 'CA'=>$alpha, 'BM'=>'/'.$bm));

$this->SetExtGState($gs);

}

function AddExtGState($parms)

{

$n = count($this->extgstates)+1;

$this->extgstates[$n]['parms'] = $parms;

return $n;

}

function SetExtGState($gs)

{

$this->_out(sprintf('/GS%d gs', $gs));

}

function _enddoc()

{

if(!empty($this->extgstates) && $this->PDFVersion

$this->PDFVersion='1.4';

parent::_enddoc();

}

function _putextgstates()

{

for ($i = 1; $i <= count($this->extgstates); $i++)

{

$this->_newobj();

$this->extgstates[$i]['n'] = $this->n;

$this->_out('<

foreach ($this->extgstates[$i]['parms'] as $k=>$v)

$this->_out('/'.$k.' '.$v);

$this->_out('>>');

$this->_out('endobj');

}

}

function _putresourcedict()

{

parent::_putresourcedict();

$this->_out('/ExtGState <

foreach($this->extgstates as $k=>$extgstate)

$this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R');

$this->_out('>>');

}

function _putresources()

{

$this->_putextgstates();

parent::_putresources();

}

}

从fpdf示例脚本中尝试this.modified脚本。

编辑:添加不透明度使用$ this-&gt; SetAlpha(0.5)

答案 3 :(得分:1)

感谢Jyelton对我的问题的回答看起来像stackover flow是无效的....

答案 4 :(得分:0)

这是一种MPDF的做法,在面向横向的PDF的每一页上都添加了水印。

//First, get the correct document size.

$mpdf = new \Mpdf\Mpdf([

'tempDir' => storage_path('app'),

'orientation' => 'L'

]);

$pagecount = $mpdf->SetSourceFile('[path]');

$tplId = $mpdf->ImportPage(1);

$size = $mpdf->getTemplateSize($tplId);

//Open a new instance with specified width and height, read the file again

$mpdf = new \Mpdf\Mpdf([

'tempDir' => storage_path('app'),

'format' => [$size['width'], $size['height']]

]);

$mpdf->SetSourceFile('[path]');

//Write into the instance and output it

for ($i=1; $i <= $pagecount; $i++) {

$tplId = $mpdf->ImportPage($i);

$mpdf->addPage();

$mpdf->UseTemplate($tplId);

$mpdf->SetWatermarkText('[Watermark Text]');

$mpdf->showWatermarkText = true;

}

return $mpdf->output();

花了我一段时间使输出结果正确大小,最后发现关键是您需要为要编写的实例指定宽度和高度。就我而言,输入的PDF文件可能具有不同的大小,因此在编写文件之前,我必须启动另一个实例以获取大小。

如果您的PDF版本高于1.4,PDFI将无法使用。

您必须将其转换为1.4。我在Laravel工作中使用xthiago/pdf-version-converter。

纯php 给pdf加水印,如何使用PHP为现有PDF文件添加水印?相关推荐

  1. python pdf 加水印_python encode64用PDFlib给PDF添加水印(Python)

    以下是用PDFlib给pdf添加水印的速记,另外PDFStamp是个很好用的pdf水印工具.PDFlib功能比较多.杂:PDFStamp功能单一,更方便使用.据walker测试,PDFlib会比PDF ...

  2. python pdf 加水印_Python中通过PyPDF2实现PDF添加水印

    场景 PyPDF 2是一个纯python PDF库,能够分割.合并.裁剪和转换PDF文件的页面.它还可以向PDF文件中添加自定义数据.查看选项和密码.它可以从PDF检索文本和元数据,还可以将整个文件合 ...

  3. 怎么给pdf加水印?教3个简单的方法

    怎么给pdf加水印?因为我们知道给pdf加水印有很大的作用和好处. 首先水印可以起到保密和防伪的作用,避免他人未经授权使用或篡改PDF文档.水印可以带有一些额外信息,如公司名称.版权声明等,以便识别和 ...

  4. PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴

    PDF转变为图片: 把图片进行切割: 把图片转变回PDF: 为PDF加水印文字: 为PDF加水印图片. 1,PDF转变为图片 /*** @author dalin*将PDF格式的文件转换成png文件* ...

  5. java pdf水印排布问题_java 实现 PDF 加水印功能

    使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 com.itextpdf itextpdf 5.5.11 com.itextpdf itext-asian 5.2.0 java 代码实 ...

  6. Java实现Excel和word转pdf加水印,复制及可用

    Java实现Excel和word转pdf加水印,复制及可用 时隔大半年,之前朋友,今天突然找我说,他们有个需求要做这东西.想起来之前自己照着官方文档写,也走了不少坑.今天就索性写个,也为了方便以后使用 ...

  7. java如何给pdf加水印_java pdf加水印的方法

    本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下 引入依赖 com.itextpdf.tool xmlworker 5.5.10 com.itextpdf itextpd ...

  8. XDOC Office Server 发布 1.1.0 版本,支持 PDF 加水印

    XDOC Office Server 是一个 JavaEE 服务,用于将 Office 文档转换为 PDF,格式兼容性好. 版本更新 支持 &_watermark 参数,对生成的 PDF 加水 ...

  9. java使用2种方法操作liberoffice把word转pdf,pdf加水印,java远程调用Linux执行命令

    文章目录 libreoffice下载地址 安装 (第一种) java调用 (第二种 推荐) java调用Linux命令转pdf java远程连接Linux执行命令(少数情况) linux安装windo ...

  10. 怎么给pdf加水印,pdf加水印步骤

    怎么给pdf加水印?有时候位置方式别人随意使用pdf文件里面的内容,我们需要给做好的pdf文件添加水印,这样可以起到一定的保护作用,那么怎么给pdf文件添加水印呢?有的小伙伴肯定会说,用专业的pdf编 ...

最新文章

  1. asp.net发布网站(转)
  2. php上传多个文件类型,ThinkPHP上传多文件多类型
  3. 运用EL表达式进行复杂比较(在JSTL中调用函数)
  4. ubuntu16.04 装机4:安装防火墙ufw
  5. Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
  6. PHP+MySQL实现新闻管理系统
  7. Sublime Text 一键删除空白行的方法
  8. win7序列号(可激活所有版本)
  9. 严肃讨论:如何自给自足获取自主学习磁力种子?
  10. 微软控制云服务器软件,服务器远程控制用什么软件
  11. Mysql免安装版win精简教程
  12. iOS 开发工具整理
  13. STM32CubeMx + LWIP(实现UDP组播/MQTT/热插拔)系列 二 ----- CubeMx生成文件的简单介绍与热插拔
  14. 在iOS中调用C语言的国密算法SM2以替换RSA
  15. 以太猫游戏主合约(六)
  16. Upload-labs 1-21关 靶场通关攻略(全网最全最完整)
  17. Linux学习笔记——软件安装
  18. python扫描局域网端口和ip_python实现扫描局域网指定网段ip的方法
  19. java实现黑图、透明图检测
  20. Kotlin关键字操作符说明及使用示例与解释

热门文章

  1. 阿尔泰数据采集卡模拟量采集演示
  2. 【Android】Service管理通知栏通知模板
  3. 一文读懂《医疗器械定期风险评价报告》撰写要点
  4. php doctrine,Doctrine学习笔记 —— 1
  5. 特斯拉“深陷”召回/监管调查,“高田气囊门”是前车之鉴
  6. html 淡入淡出效果,css3 transition实现淡入淡出效果 - 小俊学习网
  7. 生活中图像处理的一个小应用
  8. 触觉智能分享-RK3568 Android11修改默认输入法
  9. 关于Hibernate中调用集合类时出现的 the owning Session was closed 错误解决方案
  10. 跑通CHPDet模型