php根据word模板生成pdf文件并添加水印
php根据word模板生成pdf文件并添加水印
- 背景说明
- 工具介绍
- 示例代码
- 总结
背景说明
在一些项目中,经常会出现这样的需求
- 用户上传了word或者excel文件,需要审核或者查看这些文件内容的时候,总不能一个一个下载吧,那样用户是很难接受的,因此需要一个word,excel,甚至ppt预览的功能,一般的方案都是把word和excel转成pdf然后前端就可以直接预览了,ppt的话,还需要转成图片。
- 一些电子协议的场景需求,例如去注册公司的时候使用的就是电子协议,需要使用银行的U盾签名然后提交审核,电子协议一般都是使用pdf进行签名,签名后锁定,修改即失效。
- 为了安全考虑,许多协议上面都需要加上水印,为了重要信息的泄露的追责
对于这样的一些需求,如果没做过很容易一头雾水不知道该怎么办,其实有很多工具可以使用,综合起来就可以实现word,excel,pdf,ppt之间的各种操作了,ppt我这里还没有做过这种需求,先不介绍了,主要介绍word和pdf的操作,其他的原理也是类似。
工具介绍
word模板变量替换工具:phpword库中的 \PhpOffice\PhpWord\TemplateProcessor 类
地址:https://packagist.org/packages/phpoffice/phpword
word,excel转pdf的工具:libreoffice软件,linux和windows上都适用,样式什么的目前没发现转了之后有变化的,但是phpword虽然提供了转的方法,但是兼容性试了一下太差了。
地址:https://www.libreoffice.org/download/download/
操作pdf的工具:Fpdi库,目前php操作pdf功能最全的库
地址:https://packagist.org/packages/setasign/fpdi
示例代码
- word模板的内容替换
首先需要在word文件中加入 ${name} 这样的内容用于替换,然后就可以使用TemplateProcessor找出该替换的地方,并替换上需要的值
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($filePath);$variableList = $templateProcessor->getVariables();foreach ($variableList as $key) {if (isset($userInfo[$key])) {$templateProcessor->setValue($key, htmlspecialchars($userInfo[$key]));}}$templateProcessor->saveAs($tempFile);
- word转pdf
上面的操作已经将模板替换上需要内容,然后就是转成pdf,使用exec操作libreoffice直接转
$wordinfo = pathinfo($wordPath);$tmp_dir = storage_path('app');exec("soffice --headless --convert-to pdf:writer_pdf_Export {$wordPath} --outdir {$tmp_dir}");
- 加水印
上面的操作生成了pdf文件了,现在是加水印的操作
$pdf = new Fpdi();$pageCount = $pdf->setSourceFile('old_pdf.pdf');for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {$templateId = $pdf->importPage($pageNo);$size = $pdf->getTemplateSize($templateId);if ($size['width'] > $size['height']) $pdf->AddPage('L', array($size['width'], $size['height']));else $pdf->AddPage('P', array($size['width'], $size['height']));var_dump($size);$pdf->useTemplate($templateId);for($j = 0 ; $j < $size['height']; $j += 60){for ($i = 0; $i < $size['width'];$i += 40){$pdf->SetXY($i, $j);$pdf->Image('watermark.png',$i+10,$j+10,30,20);}}}$pdf->Output('new_pdf.pdf', 'F');
按照以上操作,加水印的pdf已经生成了,前端可以直接用pdf.js的库预览了
总结
这种和文件操作的需求,找对方法其实也很简单,在项目过程中遇到的比较坑的库是phpword,不知道是不是版本太低的缘故,支持的方法不多,而且兼容性很坑,基本样式都会乱,使用phpword模板操作样式就不会乱了,只是替换变量。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
