根据项目需求,需要用到一个功能,根据页面参数需要动态的生成一个world,并将world生成两份PDF文件,一份正式文件,一份临时的电子文件(带有二维码,扫描可以下载正式文件的电子版本)。同时上传到文件存储服务器minio上,下面介绍具体的实现步骤

1、首先准备一个world模板,新建一个world如下图所示

在需要动态填入数据的地方采用字母代替(此处注意,字母需要大写),用于占位操作。

2、编辑代码,项目接口,我采用的是一般的是SpringBoot项目结构,具体不多述,下面贴出关键代码:①根据接口获取到的参数,来开始命名最后要生成的pdf文件

scXwblPdfRequest  是接口传来的实体形的参数

 //生成文件名String pdfName = FileUpload.aliyungenFileNameNew("文档名_"+scXwblPdfRequest.getWorkUnit()+"_"+scXwblPdfRequest.getName());String fileName = pdfName + "_2.pdf";String fileNameZswj = pdfName+".pdf";

②准备文件

String pdfUrl = fwurl  +bucketName+Constants.SPRIT+ fileName;
String pdfUrlZswj = fwurl +bucketName+Constants.SPRIT+ fileNameZswj;
//获取本地准备的world模板
String mblj = "file/xwbl_1.doc";
Map<String , String> textMap = createXwblTextMap(scXwblPdfRequest );
//设置pdf的文件地址(含二维码)
String pdfUrl = fwurl  +bucketName+Constants.SPRIT+ fileName;
//设置pdf的正式文件地址(不含二维码)
String pdfUrlZswj = fwurl +bucketName+Constants.SPRIT+ fileNameZswj;

方法说明:createXwblTextMap是将接口传来的实体参数,进行处理,以map形式处理好

//构造textMappublic Map createXwblTextMap(ScXwblPdfRequest  xwblPdfRequest){Map<String , String> textMap = new HashMap<>();//开始时间textMap.put("STIME",String.valueOf(xwblPdfRequest.getStartTime()));//结束时间textMap.put("ETIME",String.valueOf(xwblPdfRequest.getEndTime()));//地点textMap.put("XWADRESS",xwblPdfRequest.getXwadress());//姓名textMap.put("NAME",xwblPdfRequest.getName());//性别textMap.put("SEX",xwblPdfRequest.getSex());return textMap;}

3、文件的其他信息处理,uploadforXwblUrl:是处理world完成后生成含有二维码的pdf文件,XwblzswjUrl :是处理world完成后生成不含有二维码的pdf文件

//保存两个pdf,一个含二维码的临时文件,一个正式文件//加了二维码,用于扫码下载   (pdfUrlZswj  用于给二维码下载地址)textMap.put("EWMTIPS","扫描二维码查看、下载正式文件");
//不带二维码的地址String withoutEwmUrl = pdfUrlZswj;String  uploadforXwblUrl   = xwblcs(bucketName,textMap  , pdfUrl , fileName , true , mblj , withoutEwmUrl );//没有二维码textMap.put("EWMTIPS","");String  XwblzswjUrl = xwblcs(bucketName,textMap  , pdfUrlZswj , fileNameZswj , false , mblj ,"");result.put("uploadforXwblUrl",uploadforXwblUrl);result.put("XwblzswjUrl", XwblzswjUrl);

方法说明:xwblcs作用:主要用于生成PDF文件

//生成PDF文件public String xwblcs(String bucketName,Map<String , String> textMap  , String pdfUrl ,String fileName , boolean ewm  , String mbwj ,String withoutEwmUrl ){try{MinioUtils minio = new MinioUtils();//读取doc模板文件ClassPathResource classPathResource = new ClassPathResource(mbwj);Document doc = new Document(classPathResource.getInputStream());DocumentBuilder builder = new DocumentBuilder(doc);//关闭文件流classPathResource.getInputStream().close();//向文档中插入文字AsposeUtil.docTextReplace(doc , textMap);//插入二维码if(ewm){AsposeUtil.docEwmReplace(builder ,withoutEwmUrl);}OutputStream  outputStreamPdf= new ByteArrayOutputStream(1024);doc.save(outputStreamPdf, SaveFormat.PDF);ByteArrayOutputStream baosPdf = (ByteArrayOutputStream) outputStreamPdf ;ByteArrayInputStream inputStreamPdf = new     ByteArrayInputStream(baosPdf.toByteArray());/**生成好的PDF文件上传到minio**/minio.putObject(bucketName,fileName,inputStreamPdf,"application/pdf");//关闭流baosPdf.close();inputStreamPdf.close();outputStreamPdf.close();/**生成的刚上传的PDF文件返文件路径**/return pdfUrl;}catch (Exception e){log.error(e.toString());throw new BussinessException(BizExceptionEnum.PDF_ERROR);}}

AsposeUtil:工具类,用于处理文字、图片插入插入文档,贴代码

@Slf4j
public class AsposeUtil {/*** word转pdf*/public static void docToPdf(String intPath, String outPath) throws Exception {Document doc = new Document(intPath);FileOutputStream os = null;//新建一个pdf文档//File file = new File(outPath);//os = new FileOutputStream(file);//保存为pdf文件,saveFormat取的是words包下的,值为:40doc.save(outPath);//os.close();}public static void docTextReplace(Document doc, Map<String, String> textMap) throws Exception {Range range = doc.getRange();for (Map.Entry<String, String> entry : textMap.entrySet()) {range.replace(entry.getKey(), entry.getValue(), true, false);}}public static void docEwmReplace(DocumentBuilder builder , String pdfUrl) throws Exception {//读取用于放在二维码中间的图片ClassPathResource classPathResource1 = new ClassPathResource("file/ewmLogo.jpg");OutputStream  outputStream = new ByteArrayOutputStream(1024);QRCodeUtil.encode(pdfUrl, classPathResource1.getInputStream(),outputStream , true);classPathResource1.getInputStream().close();ByteArrayOutputStream baos = (ByteArrayOutputStream) outputStream ;ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray());//插入二维码builder.moveToBookmark("EWM");builder.insertImage(inputStream , 150 , 150);outputStream.close();baos.close();inputStream.close();inputStream.close();}}

这里需要注意的是。在这个工具类中,有向world中插入图片的操作,builder.moveToBookmark("EWM");,这里插入进去的图片,不是用占位符去对应的,而是在world模板中需要插入一个名为“EWM”的书签,

最后流程介绍到此结束。最后用接口工具调用该接口,会返回两个地址,一个带二维码。一个不带二维码

最后访问minio的地址获取到两个pdf文件。同时手机或者pad,扫描带有二维码的pdf上的二维码,也能下载不带二维码,用于打印的文档

java使用world模板动态生成PDF文件相关推荐

  1. java maven 读写pdf_Java动态生成pdf文件(使用itext编辑pdf)

    一.创建pdf模板 使用PDFelement制作pdf模板(数据域的名称对应后面插入的key) 二.导入maven依赖 com.itextpdf itextpdf 5.5.13 com.itextpd ...

  2. Java读取pdf模板,并动态生成pdf文件,如动态生成准考证

    Java读取pdf模板,并动态生成pdf文件,如动态生成准考证 ​ 前几天遇到了一个生成准考证的需求,并提供用户下载,然后百度了一圈还是觉得使用itextpdf这个框架好用点.但是还需要找到一个能创建 ...

  3. java动态生成pdf文件的方法

    java动态生成pdf文件 文章目录 java动态生成pdf文件 前言 一.生成pdf模板 二.使用步骤 1.使用jar包 2.pdf实现方法 总结 前言 java开发过程中难免会遇到生成文件的需求, ...

  4. java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件

    简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...

  5. 如何动态生成pdf文件?

    pdfService系统 一. 背景 在许多开发需求中都有动态生成pdf文件的需求,例如根据已有的json字符串渲染到一个表格中,然后生成对应的PDF文档,以往的解决方法是调用许多个接口生产pdf文件 ...

  6. java基于word模板动态生成word及转pdf实践

    在项目中很容易会遇到需要动态生成pdf的应用场景,其实现方式也比较多 由于项目的关系,对于这种组件性的开发方式我想的是怎么方便怎么来,怎么快就怎么来 在咨询了之前做政务系统的同学后,他们都一致推荐我使 ...

  7. java设置pdf不可编辑_Java动态生成pdf文件(使用itext编辑pdf)

    一.创建pdf模板 使用PDFelement制作pdf模板(数据域的名称对应后面插入的key) 二.导入maven依赖 com.itextpdf itextpdf 5.5.13 com.itextpd ...

  8. Java动态生成pdf文件(用于实时生成电子证书)

    1.首先,新建一个word文档,内容如下,另存为pdf格式,我的命名:mytest.pdf. 2.用Adobe Acrobat Pro 打开刚刚制作的pdf文件.如下图: 3.点击创建–>PDF ...

  9. java动态生成pdf文件(使用itext编辑pdf)

最新文章

  1. 关于SpringMVC和Struts2的区别
  2. 开源Gis简介(转)
  3. Oracle ETL日志审计存储过程示例
  4. c语言 行程长度编码,C语言编程题,求大佬帮助,关于数组的。
  5. LeetCode 1781. 所有子字符串美丽值之和
  6. 倒计时 2 天,2018 中国大数据技术大会(BDTC)报名通道即将关闭(附参会提醒)...
  7. [3/21]Windows Server 2008时钟方面的改进展示
  8. 有点火的程序秒收录牛X
  9. Docker-构建/启停容器镜像及常用命令介绍
  10. 高盛 CEO:没背景的孩子,请与有野心的人为伍!
  11. Android 网络开发框架的选择
  12. VMware 修复 View Planner中的严重RCE 漏洞
  13. iptables防火墙基础
  14. MCSE 2012 R2之工作文件夹Word Folders(2)
  15. Java开发两年:java简历包装工作经验
  16. extjs初学者教程
  17. ping网络诊断常见故障
  18. Abp vNext swagger注释
  19. 阿里巴巴安全响应中心成立了
  20. 牛客SQL3查询薪水详情和部门编号

热门文章

  1. docker 运行异常处理(持续更新)
  2. 可以免费发布本地生活分类信息的网站大全
  3. python gpib仪器控制_Python的扩展接口[0] - VISA仪器控制
  4. 【报表设计】--层次坐标和父子格设置
  5. 为什么Precision高Recall就低——F1 score
  6. 【目标规划】暑假计划
  7. del服务器能装win7系统吗,500系列主板能不能装win7?500系列主板装win7教程(支持11代)...
  8. 解决 小程序界面数据不显示问题
  9. javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)
  10. 解决Python中出现的Memory Error的问题