根据word模板生成word和PDF

需求:有一个固定的合同模板,在vue前台填写指定的信息,替换合同模板指定的内容

我们使用的默认模板内容如图:

我们在前端填写的字段就是合同名称、项目名称和项目金额,vue将这些内容填写到name、project、money字段,进行替换。

数据库表内容:(仅作为测试demo使用,需根据具体需求更改)

前端界面:

路径字段不应该展示,这里只是为了演示方便

点击合同签订按钮,跳转字段填写界面

这里填写的信息会传递到后台,进行替换,并且把替换后的word以及pdf路径生成到wordpath和pdfpath字段里,进而实现下载功能。

前台代码:(基础信息查询界面不再展示,只展示)

<template><div class="app-container"><el-card class="box-card">
<h1 style="text-align: center">生成合同信息</h1><el-form ref="form" :model="form" :rules="rules" label-width="80px"><el-form-item label="名称" prop="hname"><el-input v-model="form.hname" placeholder="请输入名称" /></el-form-item><el-form-item label="项目名" prop="project"><el-input v-model="form.project" placeholder="请输入项目名" /></el-form-item><el-form-item label="金额" prop="money"><el-input v-model="form.money" placeholder="请输入金额" /></el-form-item><el-form-item label="备注" prop="note"><el-input v-model="form.note" placeholder="请输入备注" /></el-form-item>
<div style=" text-align: right;"><el-button @click="updateForMation">提交信息</el-button><el-button @click="wordxiazai">word下载</el-button><el-button @click="pdfxiazai">pdf下载</el-button>
</div></el-form></el-card></div>
</template>
<script>import { getClean, uploadFile,updateFile } from "@/api/module/gs/details";import {  listFilepdf, getFilepdf, delFilepdf, addFilepdf, updateFilepdf} from "@/api/project/filepdf";export default {data() {return {// 遮罩层loading: true,// 选中数组ids: [],// 非单个禁用single: true,// 非多个禁用multiple: true,// 显示搜索条件showSearch: true,// 总条数total: 0,// pdf信息表格数据filepdfList: [],// 弹出层标题title: "",// 是否显示弹出层open: false,// 查询参数queryParams: {pageNum: 1,pageSize: 10,hname: null,project: null,money: null,wordpath: null,pdfpath: null,note: null,note1: null,note2: null,note3: null,note4: null,note5: null,note6: null,note7: null,note8: null},// 表单参数form: { hname: '',project: '',money: '',wordpath: '',pdfpath: '',note: null,note1: null,note2: null,note3: null,note4: null,note5: null,note6: null,note7: null,note8: null},// 表单校验rules: {}};},created() {const id = this.$route.query.id;console.log(id)if (id) {// 获取表详细信息getFilepdf(id).then(response => {this.form = response.data;});}},methods: {/** 查询pdf信息列表 */getList() {this.loading = true;listFilepdf(this.queryParams).then(response => {this.filepdfList = response.rows;this.total = response.total;this.loading = false;});},//点击提交信息按钮将字段信息传递到后台updateForMation(){updateFile(this.form).then(response => {});},wordxiazai(){//下载功能:重点url就是word的路径的字段值var name = this.pdfpath;var url = this.form.wordpath;var suffix = url.substring(url.lastIndexOf("."), url.length);const a = document.createElement('a')a.setAttribute('download', name )a.setAttribute('target', '_blank')a.setAttribute('href', url)a.click()},pdfxiazai(){//下载功能:重点url就是pdf的路径的字段值var name = this.pdfpath;var url = this.form.pdfpath;var suffix = url.substring(url.lastIndexOf("."), url.length);const a = document.createElement('a')a.setAttribute('download', name )a.setAttribute('target', '_blank')a.setAttribute('href', url)a.click()}}}
</script>
//js连接后台路径,另一个"@/api/project/filepdf"不写了
export function updateFile(data) {return request({url: '/project/api/process/',method: 'post',data: data,})
}

后台代码:

这段代码的大致流程是:

  1. 接收前端传递过来的Filepdf对象,其中包含了Word文件的路径、姓名、项目名称和金额等信息。
  2. 将Word文件读取为XWPFDocument对象,遍历其中的所有段落,并判断是否包含需要替换的文本串,如果包含则进行文本替换。
  3. 将替换后的XWPFDocument写入到新的Word文件中(命名方式为"word_当前时间戳.docx")。
  4. 将新生成的Word文件读取为另一个XWPFDocument对象,然后将其转换为PDF格式,并将PDF输出到新的文件中(命名方式为"pdf_当前时间戳.pdf")。
  5. 将新生成的Word和PDF文件的访问路径(“http://127.0.0.1:9300/statics/具体名称”)分别设置到Filepdf对象的Wordpath和Pdfpath字段中。
  6. 更新Filepdf对象,并返回操作成功的信息。
 // 文件处理接口@PostMapping("/process")public AjaxResult processFile(@RequestBody Filepdf filepdf) throws IOException {//接收到前台传递过来的filepdf//把 filepdf的Wordpath字段设置为模板的路径filepdf.setWordpath("D:\\YinHe-Yqgbathe\\ruoyi-modules\\ruoyi-project\\src\\main\\java\\com\\ruoyi\\project\\module\\gs\\template.docx");//wordfilePath设置为模板的路径String wordfilePath = filepdf.getWordpath();//声明fis,以字节流的形式读取文件,fis 代表一个 FileInputStream 对象,它指向要读取的 Word 文件。FileInputStream fis = new FileInputStream(wordfilePath);//创建一个 XWPFDocument 实例,该实例与指定的 Word 文件建立了连接,XWPFDocument 是一个用于处理 .docx 文件的类XWPFDocument document = new XWPFDocument(fis);//使用 for 循环遍历 XWPFDocument 中的所有段落for (XWPFParagraph paragraph : document.getParagraphs()) {//使用 XWPFParagraph 类中的 getParagraphText() 方法来获取当前处理的段落中包含的文本内容String paragraphText = paragraph.getParagraphText();// 判断该段落中是否包含需要替换的文本串,因为我们要替换name,project,money,具体根据需求更改if (paragraphText.contains("name") || paragraphText.contains("project") || paragraphText.contains("money")) {//使用while是为了替换每一个,防止漏掉boolean foundMatch = true;while (foundMatch) {foundMatch = false;//使用 XWPFParagraph 类中的 getRuns() 方法获取当前处理的段落中包含的所有文本样式 Runfor (XWPFRun run : paragraph.getRuns()) {//调用 getText(int pos) 方法可以获取该文本样式 Run 中从指定位置(pos)开始的所有文本信息,并将其作为一个字符串返回String runText = run.getText(0);//以下三个if是具体替换,eg.如果有name就替换为filepdf.getHname(),就是前端接受的内容if (runText != null && runText.contains("name")) {runText = runText.replaceFirst("name", filepdf.getHname());run.setText(runText, 0);foundMatch = true;}if (runText != null && runText.contains("project")) {runText = runText.replaceFirst("project", filepdf.getProject());run.setText(runText, 0);foundMatch = true;}if (runText != null && runText.contains("money")) {runText = runText.replaceFirst("money", filepdf.getMoney());run.setText(runText, 0);foundMatch = true;}}}}}//关闭FileInputStreamfis.close();//设置path1为D:/ruoyi/uploadPath,因为若依默认存储为D:/ruoyi/uploadPath,可以根据配置文件进行更改String path = "D:/ruoyi/uploadPath";//拼接具体名称,按照时间命名,并且存储到相应位置String newwordFilePath = path + "/word_" + System.currentTimeMillis() + ".docx";FileOutputStream fos = new FileOutputStream(newwordFilePath);document.write(fos);fos.close();XWPFDocument doc = new XWPFDocument(new FileInputStream(newwordFilePath));// docx//转为pdf// 创建输出流,设置名称String newPdfFilePath = path + "/pdf_" + System.currentTimeMillis() + ".pdf";String outputPDFFiles = newPdfFilePath; // 输出的.pdf文件路径FileOutputStream foss = new FileOutputStream(outputPDFFiles);PdfOptions options = PdfOptions.create();// 将 .docx 转换为 .pdfPdfConverter.getInstance().convert(doc, foss, options);// 关闭输出流foss.close();System.out.println("转换完成");//因为前端不可以下载绝对路径,所以要拼接成http://127.0.0.1:9300/statics/***的形式,***为具体名称(D:/ruoyi/uploadPath后的名称)//设置wordpath字段int index = newwordFilePath.lastIndexOf("/");String q = newwordFilePath.substring(index);filepdf.setWordpath("http://127.0.0.1:9300/statics" + q);//设置pdfpath字段int index1 = newPdfFilePath.lastIndexOf("/");String q1 = newPdfFilePath.substring(index1);filepdf.setPdfpath("http://127.0.0.1:9300/statics" + q1);// 执行更新filepdfService.updateFilepdf(filepdf);return AjaxResult.success();}

注:需要在pom.xml中导入指定依赖,内容为:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version>
</dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.13</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version>
</dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.pdf</artifactId><version>1.0.6</version>
</dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>xmpbox</artifactId><version>2.0.13</version>
</dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.pdf</artifactId><version>1.0.6</version>
</dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>xmpbox</artifactId><version>2.0.13</version>
</dependency>

根据word模板生成word和PDF相关推荐

  1. 使用word模板生成word文档的各类方案

    使用word模板生成word文档的各类方案 生成word的各种方案 word另存xml进行后续处理 2003版本word(.doc)的xml处理并生成word 2007版本word(.docx)的xm ...

  2. word模板生成word报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  3. C#根据word模板生成word表格报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  4. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子

    [实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...

  5. JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...

    Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...

  6. 使用java Apache poi 根据word模板生成word报表

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  7. PHP 使用word模板生成word文档示例

    <?php namespace Home\Controller; use PhpOffice\PhpWord\TemplateProcessor; use Think\Controller; c ...

  8. java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能. 下面是一个简单的示例代码,可以帮助您快速入门. 模 ...

  9. 根据标准word模板生成word文档类库(开源)

    前言   最近因项目需要要自定义标准word模板,并以编码方式操作word模板.填充数据和生成word文档,于是自己写了条小"内裤"来实现这个功能.该"内裤"只 ...

最新文章

  1. c# usercontrol ,networkcomms3.0 Invoke总结
  2. FPGA设计心得(9)基于DDS IP核的任意波形发生器设计
  3. iOS App Launch Option
  4. shadow ssdt学习笔记
  5. python 排序统计滤波器_马尔可夫链+贝叶斯滤波器的Python展示
  6. vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...
  7. fork( )函数(转载)
  8. 6个残酷的人生事实[转]
  9. 分布式事务的四种解决方案,值得参考!
  10. PulseAudio 模块化实现录音和放音
  11. 2018招行笔试分红包
  12. 微信小程序:经典语录大全微信小程序源码
  13. 塔夫斯大学计算机教授,观汗辨健康?美国塔夫茨大学发明了一种汗液传感器
  14. 北京工业大学计算机考研录取名单,2018年北京工业大学考研拟录取名单公示——信息学部...
  15. (27)第四节课:从零起步在框架中编码实现损失度Loss的计算及其可视化
  16. Shiro RememberMe 反序列化漏洞
  17. 乐视清空酷派股份;B站将于2018年赴美上市;苹果关闭所有iPhone降级通道丨价值早报
  18. (ZZ) 剖析系统虚拟化(4)——VMware ESX架构介绍
  19. 美国大学特别重视的批判性思维,是如何培养出来的?
  20. 如何开发搭建网红直播带货系统,听我说

热门文章

  1. Java学习07:Java面向对象
  2. CFA II 学习记录-Quantitative
  3. xshell换行对不齐,命令行乱飞问题
  4. ChatGPT自动开发SwiftUI App
  5. 案例分析:浅谈12306核心模型设计思路和架构设计。
  6. 通达信l2接口公式如何使用?
  7. Golang中获取中文字符串的子串字符位置及截取子串
  8. LAMP+DISCUZ论坛
  9. NTFS学习笔记(1):DBR
  10. APIC 基于postman实现自动化