纯php 给pdf加水印,如何使用PHP为现有PDF文件添加水印?
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文件添加水印?相关推荐
- python pdf 加水印_python encode64用PDFlib给PDF添加水印(Python)
以下是用PDFlib给pdf添加水印的速记,另外PDFStamp是个很好用的pdf水印工具.PDFlib功能比较多.杂:PDFStamp功能单一,更方便使用.据walker测试,PDFlib会比PDF ...
- python pdf 加水印_Python中通过PyPDF2实现PDF添加水印
场景 PyPDF 2是一个纯python PDF库,能够分割.合并.裁剪和转换PDF文件的页面.它还可以向PDF文件中添加自定义数据.查看选项和密码.它可以从PDF检索文本和元数据,还可以将整个文件合 ...
- 怎么给pdf加水印?教3个简单的方法
怎么给pdf加水印?因为我们知道给pdf加水印有很大的作用和好处. 首先水印可以起到保密和防伪的作用,避免他人未经授权使用或篡改PDF文档.水印可以带有一些额外信息,如公司名称.版权声明等,以便识别和 ...
- PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴
PDF转变为图片: 把图片进行切割: 把图片转变回PDF: 为PDF加水印文字: 为PDF加水印图片. 1,PDF转变为图片 /*** @author dalin*将PDF格式的文件转换成png文件* ...
- java pdf水印排布问题_java 实现 PDF 加水印功能
使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 com.itextpdf itextpdf 5.5.11 com.itextpdf itext-asian 5.2.0 java 代码实 ...
- Java实现Excel和word转pdf加水印,复制及可用
Java实现Excel和word转pdf加水印,复制及可用 时隔大半年,之前朋友,今天突然找我说,他们有个需求要做这东西.想起来之前自己照着官方文档写,也走了不少坑.今天就索性写个,也为了方便以后使用 ...
- java如何给pdf加水印_java pdf加水印的方法
本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下 引入依赖 com.itextpdf.tool xmlworker 5.5.10 com.itextpdf itextpd ...
- XDOC Office Server 发布 1.1.0 版本,支持 PDF 加水印
XDOC Office Server 是一个 JavaEE 服务,用于将 Office 文档转换为 PDF,格式兼容性好. 版本更新 支持 &_watermark 参数,对生成的 PDF 加水 ...
- java使用2种方法操作liberoffice把word转pdf,pdf加水印,java远程调用Linux执行命令
文章目录 libreoffice下载地址 安装 (第一种) java调用 (第二种 推荐) java调用Linux命令转pdf java远程连接Linux执行命令(少数情况) linux安装windo ...
- 怎么给pdf加水印,pdf加水印步骤
怎么给pdf加水印?有时候位置方式别人随意使用pdf文件里面的内容,我们需要给做好的pdf文件添加水印,这样可以起到一定的保护作用,那么怎么给pdf文件添加水印呢?有的小伙伴肯定会说,用专业的pdf编 ...
最新文章
- asp.net发布网站(转)
- php上传多个文件类型,ThinkPHP上传多文件多类型
- 运用EL表达式进行复杂比较(在JSTL中调用函数)
- ubuntu16.04 装机4:安装防火墙ufw
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
- PHP+MySQL实现新闻管理系统
- Sublime Text 一键删除空白行的方法
- win7序列号(可激活所有版本)
- 严肃讨论:如何自给自足获取自主学习磁力种子?
- 微软控制云服务器软件,服务器远程控制用什么软件
- Mysql免安装版win精简教程
- iOS 开发工具整理
- STM32CubeMx + LWIP(实现UDP组播/MQTT/热插拔)系列 二 ----- CubeMx生成文件的简单介绍与热插拔
- 在iOS中调用C语言的国密算法SM2以替换RSA
- 以太猫游戏主合约(六)
- Upload-labs 1-21关 靶场通关攻略(全网最全最完整)
- Linux学习笔记——软件安装
- python扫描局域网端口和ip_python实现扫描局域网指定网段ip的方法
- java实现黑图、透明图检测
- Kotlin关键字操作符说明及使用示例与解释
热门文章
- 阿尔泰数据采集卡模拟量采集演示
- 【Android】Service管理通知栏通知模板
- 一文读懂《医疗器械定期风险评价报告》撰写要点
- php doctrine,Doctrine学习笔记 —— 1
- 特斯拉“深陷”召回/监管调查,“高田气囊门”是前车之鉴
- html 淡入淡出效果,css3 transition实现淡入淡出效果 - 小俊学习网
- 生活中图像处理的一个小应用
- 触觉智能分享-RK3568 Android11修改默认输入法
- 关于Hibernate中调用集合类时出现的 the owning Session was closed 错误解决方案
- 跑通CHPDet模型