Word制作生成html模板替换动态值为占位符使用Java转为pdf文件

  • 引言

        最近开发遇到一个需求,公司法务给了一个word合同模板,需要替换里面的动态值为具体业务数据,然后生成pdf文件进行电子签章。

        在网上找寻各种方法,发现很多都是需要特定工具,或者代码不全运行不起来,尝试了很多方法最后发现效果不是很好,所以记录下由word生成html模板,再转为pdf的方法。

        该方法适用于合同、协议、报表等制式文档,用占位符替换动态值,支持if判断、支持list列表循环,通常用于线上签章和文件展示及文件服务器存储。html模板可以调整标签参数以避免生成的pdf样式失真、乱码。


  • 易模糊的概念

        word模板:由公司法务提供的具有法律效益的word模板或由业务提供的终版样式的报表等word文档。(业务侧认为的模板)
        html模板:由word模板通过制作方法制成的将关键词替换为占位符或动态表达值的html文件。(开发侧认为的模板)
        pdf:通过代码将业务数据替换html模板里面的占位符,然后生成的pdf文件。


  • 操作步骤

        1、按照资源中的生成html操作手册制作html模板。→资源在这里
        2、生成的模板支持放在项目本地,也支持放在运城OSS存储中。
        3、使用Java代码将业务数据替换占位符,然后生成pdf。
        4、若操作有疑问或碰到无法解决的问题,可在资源的README.md中找到博主的私人联系方式。

        

  • 公司法务提供的合同模板示例图
    法务提供的合同模板示例

  • 生成的html模板示例
    在这里插入图片描述

  • 由模板生成的pdf示例
    在这里插入图片描述
            

  • 描述

    • 以上三张示例图在资源中,可以自行测试验证。
    • 通过第三张pdf的示例图,可以发现文档编写日期 和 收费标准有替换成动态值,而且样式没有乱码,也没有失真。
              
  • 资源内容
            1、word示例模板.docx
            2、word模板生成的html模板文件.html
            3、生成的pdf文件.pdf
            4、生成pdf的工程代码
            5、postman测试导出文件
            6、制作模板的全流程步骤教程(截图及注释说明)
            7、操作手册及代码示例地址在此:操作手册及代码示例传送门

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是使用 Docx4j 操作 Word替换占位符Java 代码示例: ```java import java.io.File; import java.util.HashMap; import javax.xml.bind.JAXBElement; import org.docx4j.dml.wordprocessingDrawing.Inline; import org.docx4j.jaxb.Context; import org.docx4j.model.fields.merge.MailMerger; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.wml.ContentAccessor; import org.docx4j.wml.Document; import org.docx4j.wml.Drawing; import org.docx4j.wml.R; import org.docx4j.wml.Text; public class Docx4jDemo { public static void main(String[] args) throws Exception { // 加载模板文件 File file = new File("template.docx"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(file); // 获取文档主体部分 MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); Document document = documentPart.getContents(); // 定义要替换占位符和对应的值 HashMap<String, String> mappings = new HashMap<String, String>(); mappings.put("name", "张三"); mappings.put("age", "30"); mappings.put("gender", "男"); // 替换占位符 MailMerger.performReplacements(document, mappings); // 处理含有图片的占位符 List<Object> paragraphs = document.getBody().getContent(); for (Object paragraph : paragraphs) { List<Object> runs = getAllElementFromObject(paragraph, R.class); for (Object run : runs) { List<Object> texts = getAllElementFromObject(run, Text.class); for (Object text : texts) { String value = ((Text) text).getValue(); if (value.contains("{{image")) { // 获取图片名称 String imageName = value.substring(value.indexOf("{{image=") + 8, value.indexOf("}}")); // 获取图片文件 File imageFile = new File(imageName); byte[] imageBytes = FileUtils.readFileToByteArray(imageFile); // 创建图片对象 BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, imageBytes); Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 800, 600, 1); // 替换占位符 Object parent = run; List<Object> siblings = getAllElementFromObject(parent, Drawing.class); int index = siblings.indexOf(run); siblings.add(index + 1, inline); ((ContentAccessor) parent).getContent().remove(run); } } } } // 保存修改后的文档 wordMLPackage.save(new File("output.docx")); } /** * 递归获取指定类型的元素列表 * @param obj * @param toSearch * @return */ public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) { List<Object> result = new ArrayList<Object>(); if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue(); if (obj.getClass().equals(toSearch)) { result.add(obj); } else if (obj instanceof ContentAccessor) { List<?> children = ((ContentAccessor) obj).getContent(); for (Object child : children) { result.addAll(getAllElementFromObject(child, toSearch)); } } return result; } } ``` 代码中首先加载 Word 模板文件,然后获取文档主体部分,定义要替换占位符和对应的值,使用 MailMerger.performReplacements 方法替换占位符,最后处理含有图片的占位符,并保存修改后的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小野猪

若恰好解决你的问题,望打赏哦。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值