java使用world模板动态生成PDF文件

2023-10-27

根据项目需求,需要用到一个功能,根据页面参数需要动态的生成一个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形式处理好

//构造textMap
    public 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包下的,值为:40
        doc.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上的二维码,也能下载不带二维码,用于打印的文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java使用world模板动态生成PDF文件 的相关文章

  • Java 9 中 java.se 模块的意义是什么?

    为什么 java 9 模块系统有 java se 模块 它对其他模块具有传递依赖关系 这与 Java 9 之前的世界中依赖整个 rt jar 不一样吗 module java se requires transitive java desk
  • Eclipse 调试“未找到源”

    我刚刚开始使用 Eclipse 所以慢慢来吧 但是 当尝试调试 JUnit 测试用例时 我会收到一个对话框 指出当我在测试方法中的代码中找到此行时 未找到源代码 Assert assertEquals 1 contents size 我知道
  • 如何在线程和小程序中使用双缓冲

    我有一个关于何时调用绘制和更新方法的问题 我有游戏小程序 我想在其中使用双缓冲 但我无法使用它 问题是 在我的游戏中 有一个球在 run 方法内移动 我想知道如何使用双缓冲来交换屏幕外图像和当前图像 请有人帮忙 当同时存在 update 和
  • 将 hyperjaxb3 升级到 jpa 2.1

    我正在尝试在使用 maven jpa hibernate 和 hyperjaxb 的 eclipse 项目中升级到 JPA 2 1 当我尝试执行以下操作时出现以下错误Run As Run on Server从日食内部 java lang N
  • JP QL - 一对多关系中的过滤结果

    我在尝试构建 JPQL 查询时陷入困境 并希望比我拥有更多 JPA 经验的人能够提供帮助 考虑以下两个实体 class Author String name OneToMany mappedBy author Set
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 传输级别信息与 SOAP 消息命名空间 URI 不匹配

    我收到错误 Transport level information does not match with SOAP Message namespace URI 要求您提供详细信息以解决问题 我在客户端设置了以下内容 HttpTranspo
  • 将 Flash 文件上传与 JSF 集成

    我看到我们可以通过flash文件上传来上传多个文件 喜欢SWF上传 http code google com p swfupload or YUI上传器 http yuilibrary com yui docs uploader 是否可以将
  • 动态更新 LookAndFeel 值

    我希望能够动态更新 Swing GUI 的 LookAndFeel 属性 在本例中 我有一个简单的 Swing Awt 游戏 运行最初为 Nimbus 的游戏LookAndFeel 在启动后的各个时刻 我只想更改 比方说 一个细节 应用程序
  • 处理大数据表时应该如何使用Hibernate Mapping

    问题定义 我有一个包含大量数据 超过 100 000 行 的数据库表 表结构如下 AppID DocID DocStatus 1 100 0 1 101 1 2 200 0 2 300 1 每个 applicationID 可能有数千个文档
  • 阻止 GWT 中的事件冒泡

    我有以下代码片段 changeTextArea 是一个 TextArea 对象 changeTextArea addKeyboardListener new KeyboardListenerAdapter public void onKey
  • 更改 WireMock __files 目录

    来自docs http wiremock org docs stubbing 要从文件中读取正文内容 请将文件放在 files 下 目录 默认情况下 这应该位于 src test resources 下 从 JUnit 规则运行时 当独立运
  • 无法为对象堆保留足够的空间

    每次尝试运行该程序时 我都会重复出现以下异常 VM初始化期间发生错误 无法为对象堆保留足够的空间 无法创建Java虚拟机 我尝试增加虚拟内存 页面大小 和 RAM 大小 但无济于事 我怎样才能消除这个错误 运行 JVM XX MaxHeap
  • Windows:如何获取所有可见窗口的列表?

    无论如何都要使用相关技术重新标记 我不知道它们是什么 稍后我可能会提出更详细的问题 关于具体细节 但现在我正在尝试掌握 大局 我正在寻找一种方法来枚举 Windows 上的 真实可见窗口 我所说的 真正可见的窗口 就是指 用户所说的 窗口
  • Jersey/JAX-RS:如何自动使用@Valid递归级联bean验证?

    我正在 Jersey 的 REST 资源端点中验证我的 POJO public class Resource POST public Response post NotNull Valid final POJO pojo public cl
  • 无法实例化类对象的类型 (Java)

    这是我收到错误的代码 在 new 之后的第二个 Killer 处 String classes new String 5 kills 0 Brian Moser kills 1 James Doakes kills 2 Lila Tourn
  • Hibernate - 如何通过 Hibernate 将 java.net.URL 存储到数据库中

    我有一块田地URL countryURL in a Country班级 我想将其数据存储到COUNTRY通过 Hibernate 将表存储在数据库中 哪个休眠type我应该在休眠映射文件中使用
  • Java基于参数的同步(名为互斥锁/锁)

    我正在寻找一种根据接收到的参数来同步方法的方法 如下所示 public synchronized void doSomething name some code 我想要方法doSomething同步基于name参数如下 线程 1 doSom
  • 异步方法的同步版本

    在 Java 中创建异步方法的同步版本的最佳方法是什么 假设您有一个包含这两种方法的类 asyncDoSomething Starts an asynchronous task onFinishDoSomething Called when
  • Spring验证非空元素的字符串列表

    我有一个模型类 其中包含字符串列表 该列表可以为空 也可以包含元素 如果它有元素 这些元素不能为空 举个例子 假设我有一个名为 QuestionPaper 的类 它有一个 QuestionId 列表 其中每个都是一个字符串 class Qu

随机推荐

  • 三子棋大致构建思路

    设计思路 1 菜单 输入选择 1 PLAY 开始游戏 0 EXIT 退出游戏 其他 重新进入菜单选择 2 PLAY 开始游戏 大致结构 1 创建并打印棋盘 2 玩家下棋 3 电脑下棋 4 判断局势 5 得出结果 6 返回1 菜单 3 创建并
  • Unity 入门打字机效果

    Unity 入门打字机效果 使用协程加延迟 public class UIDazhi MonoBehaviour public Text t private string currentstr public string str 欢迎来到U
  • Nginx HTTP 健康检查

    通过发送定期健康检查 包括 NGINX Plus 中可自定义的主动健康检查 来监控上游组中 HTTP 服务器的健康状况 介绍 NGINX 和 NGINX Plus 可以持续测试您的上游服务器 避免出现故障的服务器 并将恢复的服务器优雅地添加
  • e-009 matlab,matlab使用贝叶斯优化的深度学习

    此示例说明如何将贝叶斯优化应用于深度学习 以及如何为卷积神经网络找到最佳网络超参数和训练选项 要训练深度神经网络 必须指定神经网络架构以及训练算法的选项 选择和调整这些超参数可能很困难并且需要时间 贝叶斯优化是一种非常适合用于优化分类和回归
  • QT简单播放视频窗口

    一 要点 1 创建一个Widget主窗体 名为test的类 QLabel作为播放框 QListWidget作为播放列表 一个暂停按钮 暂时没懂修改 无法实现进度条进度 只是实现了双击列表 循环播放视频 或者点击按钮 暂停 继续播放视频 2
  • 1.1、Ubuntu 18.04安装(PC+虚拟机)

    一 虚拟机安装 二 PC机安装 2 1制作启动盘 2 2安装步骤 Ubuntu 18 04下载与安装 Linux有上百种不同的发行版 这里学习和使用的是Ubuntu的发行版 Ubuntu 18 04版 搭载PC端或虚拟机进行学习使用 官方下
  • C++二叉树

    代码随想录 programmercarl com 二叉树理论基础篇 算法公开课 代码随想录 算法视频公开课 opens new window 大纲如下 说到二叉树 大家对于二叉树其实都很熟悉了 本文呢我也不想教科书式的把二叉树的基础内容再啰
  • 韦东山视频第3课第2节_JNI_C调用JAVA_P【学习笔记】

    C调JAVA方法主要步骤如下 一 C代码调用java的静态方法 Hello java 1 public class Hello 2 public static void main String args 3 System out print
  • Android多媒体--MediaCodec api

    http www cnblogs com roger yu p 5635494 html MediaCodec public final class MediaCodec extends Object Java lang Object an
  • react-umi-对接Api-1.登录模块

    本篇看点 我们设计了一个很漂亮的登录UI ProForm组件的使用 跳转记录路由 提交前使用md5加密 使用umi框架做登录的话是要刷新跳转页面的 因为要配合app tsx的生命周期进行动态路由实现 官方那边也是这样做的 如果你不需要动态路
  • 学计算机的适不适合买苹果电脑,笔记本电脑的选择真的很重要!别再瞎买了

    原标题 笔记本电脑的选择真的很重要 别再瞎买了 笔记本的选择真的很重要 我求求大家不要想两三千就能买到真正好的笔记本 高端商务本真的有很多一万多块钱性能还不咋地 所以选对了适合你的才是最重要的 所以今天就来聊聊笔记本那些事 1 微软surf
  • Angular -ui - BootStrap组件的解释以及使用

    关于UI BootStrap UI BootStrap 是angularUI团队用纯粹angularJS语法编写的Bootstrap组件 1 关于ng router angular router js 和ui router angular
  • 五种方法 前端代码实现九宫格布局

    前端实现一个九宫格布局 可以用多少种方法实现呐 今天我们就来实际操作一下 看有多少种实现方式 首先 定义好通用的HTML结构 div class box ul li 1 li li 2 li li 3 li li 4 li li 5 li
  • C#入门一一类(class)

    一 什么是类 类的定义 class Person 默认修饰符是internal 表示仅在当前项目内可被访问 Class members 类访问修饰符 注意 1 在C 中只能有一个基类 如果继承了一个抽象类 则必须实现所继承的所有抽象成员 除
  • websocket 携带请求头_深入剖析WebSocket的原理

    前言 针对以上您提起的WebSocket的相关话题 给您做一下系统的梳理 WebSocket是和http类似的可以实现全双工可持久连接通信的应用层协议 以下深入剖析一下WebSocket的原理 什么是WebSocket 首先 我们需要弄明白
  • Kotlin依赖注入框架Koin

    一 简介 Koin是一款轻量级的依赖注入框架 它允许Android应用程序轻松管理组件之间的依赖关系 Koin的主要目标是使依赖注入变得简单 易于理解和使用 它采用纯Kotlin编写 无代理 无需代码生成或反射 而是基于函数式DSL和注解
  • miui删除内置不卡米教程_[MIUI玩机技巧43] Shortcut功能快速提取Apk

    今天Flashcer本期给大家分享2个玩法 1 利用MIUI 11的Shortcut功能快速提取非系统应用的安装包文件 用户应用Apk 2 利用MIUI 11的Shortcut功能快速分享非系统应用的安装包文件 用户应用Apk 通过即时通讯
  • RoaringBitmap和Bitmap的区别与原理

    背景 此文只针对应用于实时数仓 离线数仓领域的标签圈选问题 以企业为例 企业和标签之间一般是多对多的关系 这种情况下对于计算不同标签下的企业数量 或者查询不同企业对应的标签会有较大的性能压力 因此使用Bitmap或者RoaringBitma
  • Python + Pyqt5 使用listWidget设置Item的两种方法

    方法一 addItems 不用分别设置每个Item的显示样式 self ui listWidget pdfList addItems list pdfList DF 文件名 添加Item 列表中有多少个数据 就有多少个Item self u
  • java使用world模板动态生成PDF文件

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