使用TCPDF库给PDF文件加水印,需要注意无法直接使用文本,需要创建水印图片后,通过图片来设置水印效果。
目录
创建PDF
创建合同模板
创建pdf文件
简单创建
设置文档信息
去掉默认页头脚
设置间距
设置字体支持中文
设置图片比例因子
设置自动分页
写入内容(插入图片使用)
设置水印
简单水印
每页水印
获取总页数
循环设置水印
旋转水印
总结
创建PDF
创建合同模板
创建使用制作pdf文档的html合同模板。
注意:css部分样式pdf不支持,比如浮动、悬浮等,只支持一些基本的样式设置。
内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>购销合同</title>
</head>
<body>
<div class="content">
<h3 align="center">购销合同</h3>
<p>(供方)(以下简称乙方):</p>
<p>经协商同意,根据中华人民共和国经济法的规定,订立合同如下:</p>
<p>一、 产品名称、商标、型号、厂家、数量、价格、供货时间:</p>
<p>二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议</p>
<p>三、 交(提)货地点、方式:使用快递</p>
<p>四、 运输方式及到达站港和费用负担:送货上门、供方负担</p>
<p>五、 合理损耗及计算方法:无</p>
<p>六、 包装标准、包装物的供应与回收:原包装、不回收。</p>
<p>七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。</p>
<p>八、 结算方式及期限:货到验收合格、发票到后一周内付款。</p>
<p>九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。</p>
<p>十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。</p>
<p>十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。</p>
<p> </p>
..........
</div>
</body>
</html>
创建pdf文件
调用tcpdf来创建pdf文件并加入通过laravel获取的动态html字符串内容。
简单创建
$pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
//设置字体 stsongstdlight支持中文
$pdf->SetFont('msyh', '', 10);
// 第一页
$pdf->AddPage();
// 这里获取html内容
$html = file_get_contents('./test.html');
$pdf->writeHTML($html, $ln = true, $fill = false, $reseth = false, $cell = false, $align = '1');
// 四种模式 I输出、D下载、F保存本地、S输出二进制字符串
$pdf->Output('test.pdf', 'I');
设置文档信息
$pdfName = '测试合同';
$pdf->SetCreator($pdfName);
$pdf->SetAuthor('YJL');
$pdf->SetTitle($pdfName);
$pdf->SetSubject($pdfName);
去掉默认页头脚
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->setFontSubsetting(false);
设置间距
$pdf->SetMargins(10, 5, 10, true);
设置字体支持中文
$pdf->SetFont('stsongstdlight', '', 10);
设置图片比例因子
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
设置自动分页
即距离底部多少进行分页
$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);
写入内容(插入图片使用)
writeHTML方法也可插入html内容到pdf,但是插入图片需要改为writeHTMLCell方法
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '1', true);
设置水印
简单水印
可通过设置图片透明度和插入图片来设置水印
参数1-2:xy轴坐标
参数3-4:图片宽高,不设置为图片默认宽高
$pdf->SetAlpha(0.4);
$pdf->Image('./images/water_img.png', 50, 100, 0, 0);
每页水印
获取总页数
$page_num = $pdf->getPage();
或者
$page_num = $pdf->PageNo();
循环设置水印
以总页数为条件进行循环,在每一页(50, 100)坐标处 ,设置透明度和水印图片。
for ($i = 1; $i <= $page_num; $i++) {
$pdf->setPage($i);
$pdf->SetAlpha(0.3);
$pdf->Image('./images/water_img.png', 50, 100);
}
旋转水印
通过pdf Rotate方法来设置图片旋转
三个参数:
Angle:旋转角度
x:横坐标
y:纵坐标
代码如下:
// 获取pdf文档页数
$page_num = $pdf->getPage();
// 设置水印
for ($i = 1; $i <= $page_num; $i++) {
$pdf->setPage($i);
$pdf->SetAlpha(0.4);
// 旋转角度
$pdf->Rotate(20, 30, 50);
$pdf->Image('./images/water_img.png', 30, 50, 0, 10);
$pdf->Image('./images/water_img.png', 10, 150, 0, 10);
$pdf->Image('./images/water_img.png', -10, 250,0, 10);
}
效果:
总结
研究tcpdf应用pdf有很长一段时间了,还是有一个问题没法解决,就是如何获取pdf关键字坐标?倒是用python可以获取pdf文档关键字坐标,但是还是尺寸问题无法换算。