生成带签名图片的合同 (合同文件中加上客户签名图片,需要在签名位置加上书签)
生成带签名图片的合同 (合同文件中加上客户签名图片,需要在签名位置加上书签)
接上篇
aspose word转换pdf文件后将pdf文件转换为图片png
https://www.cnblogs.com/oktokeep/p/18401717
aspose word指定位置插入图片,借助word模板文件中的书签来定位 及Java 获取网络图片
https://www.cnblogs.com/oktokeep/p/18401692
1.模板文件中
本人(我单位)姓名:{realname},身份证号:{idNo} 省略文本
内容省略
被保险人签字: 加入了书签:bookmarkName = sign
日期:{year}年{month}月{day}日
2.pdf工具类
package com.example.core.mydemo.aspose; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class PdfToImage { public static void main(String[] args) { String path = "D:\\pdf\\40255371604299_1_sign.pdf"; String path2 = "D:\\pdf"; pdfFileToImages(path,path2); } public static void pdfFileToImages(String filePath, String cachePath) { PDDocument pd = null; try { pd = PDDocument.load(new File(filePath), MemoryUsageSetting.setupTempFileOnly()); PDFRenderer pdfRenderer = new PDFRenderer(pd); /* dpi越大转换后越清晰,相对转换速度越慢 */ int pages = pd.getNumberOfPages(); System.out.println("pdf总共多少页-----" + pages); for (int page = 0; page < pages; ++page) { // BufferedImage image = pdfRenderer.renderImageWithDPI(page, 96, ImageType.RGB); // BufferedImage image = pdfRenderer.renderImageWithDPI(page, 100); BufferedImage image = pdfRenderer.renderImageWithDPI(page, 150, ImageType.RGB); //将图片数据保存为PNG格式文档 File file= new File(cachePath + File.separator + ("new"+page) + ".png"); ImageIO.write(image, "png", file); System.out.println(file.getAbsolutePath()); System.out.println("PDF文档转PNG图片成功!"); } } catch (Exception e) { e.printStackTrace(); }finally { if(pd != null){ try { pd.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3.word工具类
package com.example.core.mydemo.aspose.contract; import com.alibaba.fastjson.JSON; import com.aspose.words.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.InputStream; import java.util.Map; import java.util.Objects; import java.util.regex.Pattern; public class WordUtil { public static final String PARAM_MATCH = "\\{[a-zA-Z]+\\}"; private static final Logger logger = LoggerFactory.getLogger(WordUtil.class); /** * 替换 ${param} * //@param paramMap * //@param doc */ public static void replaceText(Map<String,String> paramMap,Document doc) throws Exception { FindReplaceOptions opt = new FindReplaceOptions(); for (Map.Entry<String, String> entry : paramMap.entrySet()) { String key = String.format("{%s}", entry.getKey()); String value = Objects.isNull(entry.getValue()) ? "" : entry.getValue(); doc.getRange().replace(key,value,opt); } int replace = doc.getRange().replace(Pattern.compile(PARAM_MATCH), "", opt); if(replace>0){ //大于0 证明有未知的参数,发送邮件 logger.error("有未知的参数:{}",JSON.toJSONString(paramMap)); // EmailUtils.sendMail(ApolloConstant.EMAIL_DEVELOP,null,"生成合同异常-有未知参数", JSON.toJSONString(paramMap)); } } public static void replaceBookMark(String bookmarkName,String newBookValue,Document doc) throws Exception { BookmarkCollection bookmarks = doc.getRange().getBookmarks(); for (Bookmark bookmark : bookmarks) { if(Objects.equals(bookmark.getName(),bookmarkName)){ bookmark.setText(newBookValue); return; } } } public static void replaceBookMarkImage(String bookmarkName, InputStream inputStream, Document doc) throws Exception { DocumentBuilder db=new DocumentBuilder(doc); db.moveToBookmark(bookmarkName); // db.insertImage(inputStream,119.4,64); db.insertImage(inputStream,60,32); } }
4.测试类
package com.example.core.mydemo.aspose.contract; import com.aspose.words.Document; import com.aspose.words.SaveFormat; import com.example.core.mydemo.aspose.PdfToImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class PDFTest { public static final String PDF = ".pdf"; public static void main(String[] args) { try{ //1.配置操作 更新参数 String templatePath = "E:\\contract\\templateContrat.docx"; String outputPath = "E:\\contract"; Document document=new Document(new FileInputStream(templatePath)); Map paramsMap = new HashMap(); paramsMap.put("realname","刘德华"); paramsMap.put("idNo","430221198602178899"); //加上日期时间字段 paramsMap.put("year","2025"); paramsMap.put("month","10"); paramsMap.put("day","14"); WordUtil.replaceText(paramsMap,document); /** * 2.网络地址图片,本地图片不可以。 * 替换签名的图片地址 */ String signUrlAddr = "https://at-images.oss-cn-hangzhou.aliyuncs.com/hrocloud/cgh/app/1723623119131_940.png"; //new一个URL对象 URL url = new URL(signUrlAddr); //打开链接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求方式为"GET" conn.setRequestMethod("GET"); //超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); //通过输入流获取图片数据 InputStream fis = conn.getInputStream(); WordUtil.replaceBookMarkImage("sign",fis,document); String name="aaabbb"; //指定临时文件的目录 File tempFile = File.createTempFile(name, PDF,new File(outputPath)); System.out.println("文件=" + tempFile.getName()); document.save(new FileOutputStream(tempFile), SaveFormat.PDF); System.out.println("finish" + tempFile.getAbsolutePath() + "-" + tempFile.getCanonicalPath()); /** * 3.pdf转图片 */ String path = tempFile.getCanonicalPath(); String path2 = outputPath; PdfToImage.pdfFileToImages(path,path2); System.out.println("生成pdf图片完成"); }catch (Exception e){ e.printStackTrace(); } } }
5.生成带签名图片的合同的效果样式图片