Java实现word excel ppt模板渲染与导出及预览 LibreOffice jodconverter

news2024/11/25 15:53:58

Java Office

一、文档格式转换

文档格式转换是office操作中经常需要进行一个操作,例如将docx文档转换成pdf格式。

java在这方面有许多的操作方式,大致可以分为内部调用(无需要安装额外软件),外部调用(需要安装额外软件)。

其中,内部调用的方式虽然简单,但是会遇到一些头痛的问题,例如:文档格式错误,字体错误,内容缺少。外部调用虽然麻烦,但可以在一定程度上解决这些问题。

在技术搭配上比较推荐:jodconverter+LibreOffice

jodconverter:jodconverter是一种Java OpenDocument转换器,能够转换不同格式的文档,依赖于Apache OpenOffice或 LibreOffice。

LibreOffice:LibreOffice 是一款功能强大的办公软件,默认使用开放文档格式 (OpenDocument Format , ODF), 并支持 docx, xlsx, pptx 等其他格式。

jodconverter是支持LibreOfficeApache OpenOffice两种开源的Office软件的,但是从稳定性、转换效果、简单性,更推荐LibreOffice。

1 LibreOffice安装

LibreOffice官网:https://www.libreoffice.org/

LibreOffice下载地址:https://www.libreoffice.org/download/download-libreoffice/

LibreOffice 7.5.6:https://www.libreoffice.org/donate/dl/win-x86_64/7.5.6/zh-CN/LibreOffice_7.5.6_Win_x86-64.msi

在这里插入图片描述

其中,官方一般会发布两个版本,即最新版本和稳定版本,这里推荐稳定版本,根据自己的操作系统的版本下载对应的安装包。

其中安装流程一直点下一步就好了,记住安装路径就行。

2 项目maven依赖

<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-local</artifactId>
    <version>4.4.6</version>
</dependency>

3 代码逻辑与实现

  1. 创建OfficeManager
  2. 创建Converter
  3. 创建输入流与输出流
  4. 文档格式转换
  5. 关闭数据流和程序
3.1 创建OfficeManager
LocalOfficeManager.Builder builder = LocalOfficeManager.builder();
// 设置本地Office地址,推荐LibreOffice
builder.officeHome("D:/Program Files/LibreOffice");
// 部署主机,本地启动
builder.hostName("127.0.0.1");
// 部署端口,可以设置多个
builder.portNumbers(9000, 9001, 9002);
// 单任务过期时间 默认:120000 2分钟
builder.taskExecutionTimeout((long) (5 * 1000 * 60));
// 任务过期时间 默认:30000 3 秒
builder.taskQueueTimeout((long) (1000 * 60 * 60));
// 可以执行的最大任务数,默认200
builder.maxTasksPerProcess(1000);
// 构建
LocalOfficeManager manager = builder.build();
// 启动
manager.start();
3.2 创建Converter
LocalConverter converter = LocalConverter.builder().officeManager(manager).build();
3.3 创建输入流与输出流
// 测试word文档转pdf
// 创建输入流
FileInputStream input = new FileInputStream("E:/tmp/word/test.docx");
// 创建输出流
FileOutputStream output = new FileOutputStream("E:/tmp/word/test.pdf");
3.4 格式转换
// 进行格式转换
converter.convert(input).as(DefaultDocumentFormatRegistry.DOCX)
        .to(output).as(DefaultDocumentFormatRegistry.PDF).execute();
3.5 关闭流
// 关闭流
output.close();
input.close();
manager.stop();

4 可支持的文档类型

public static final @NonNull DocumentFormat PDF = byExtension("pdf");
public static final @NonNull DocumentFormat SWF = byExtension("swf");
public static final @NonNull DocumentFormat HTML = byExtension("html");
public static final @NonNull DocumentFormat XHTML = byExtension("xhtml");
public static final @NonNull DocumentFormat ODT = byExtension("odt");
public static final @NonNull DocumentFormat OTT = byExtension("ott");
public static final @NonNull DocumentFormat FODT = byExtension("fodt");
public static final @NonNull DocumentFormat SXW = byExtension("sxw");
public static final @NonNull DocumentFormat DOC = byExtension("doc");
public static final @NonNull DocumentFormat DOCX = byExtension("docx");
public static final @NonNull DocumentFormat DOTX = byExtension("dotx");
public static final @NonNull DocumentFormat RTF = byExtension("rtf");
public static final @NonNull DocumentFormat WPD = byExtension("wpd");
public static final @NonNull DocumentFormat TXT = byExtension("txt");
public static final @NonNull DocumentFormat ODS = byExtension("ods");
public static final @NonNull DocumentFormat OTS = byExtension("ots");
public static final @NonNull DocumentFormat FODS = byExtension("fods");
public static final @NonNull DocumentFormat SXC = byExtension("sxc");
public static final @NonNull DocumentFormat XLS = byExtension("xls");
public static final @NonNull DocumentFormat XLSX = byExtension("xlsx");
public static final @NonNull DocumentFormat XLTX = byExtension("xltx");
public static final @NonNull DocumentFormat CSV = byExtension("csv");
public static final @NonNull DocumentFormat TSV = byExtension("tsv");
public static final @NonNull DocumentFormat ODP = byExtension("odp");
public static final @NonNull DocumentFormat OTP = byExtension("otp");
public static final @NonNull DocumentFormat FODP = byExtension("fodp");
public static final @NonNull DocumentFormat SXI = byExtension("sxi");
public static final @NonNull DocumentFormat PPT = byExtension("ppt");
public static final @NonNull DocumentFormat PPTX = byExtension("pptx");
public static final @NonNull DocumentFormat POTX = byExtension("potx");
public static final @NonNull DocumentFormat ODG = byExtension("odg");
public static final @NonNull DocumentFormat OTG = byExtension("otg");
public static final @NonNull DocumentFormat FODG = byExtension("fodg");
public static final @NonNull DocumentFormat SVG = byExtension("svg");
public static final @NonNull DocumentFormat VSD = byExtension("vsd");
public static final @NonNull DocumentFormat VSDX = byExtension("vsdx");
public static final @NonNull DocumentFormat PNG = byExtension("png");
public static final @NonNull DocumentFormat JPEG = byExtension("jpg");
public static final @NonNull DocumentFormat TIFF = byExtension("tif");
public static final @NonNull DocumentFormat GIF = byExtension("gif");
public static final @NonNull DocumentFormat BMP = byExtension("bmp");

5 完整代码

public static void main(String[] args) throws OfficeException, IOException {

    // =======================构建office管理器========================
    LocalOfficeManager.Builder builder = LocalOfficeManager.builder();
    // 设置本地Office地址,推荐LibreOffice
    builder.officeHome("D:/Program Files/LibreOffice");
    // 部署主机,本地启动
    builder.hostName("127.0.0.1");
    // 部署端口,可以设置多个
    builder.portNumbers(9000, 9001, 9002);
    // 单任务过期时间 默认:120000 2分钟
    builder.taskExecutionTimeout((long) (5 * 1000 * 60));
    // 任务过期时间 默认:30000 3 秒
    builder.taskQueueTimeout((long) (1000 * 60 * 60));
    // 可以执行的最大任务数,默认200
    builder.maxTasksPerProcess(1000);
    // 构建
    LocalOfficeManager manager = builder.build();
    // 启动
    manager.start();
    // ======================构建文档转换器======================
    LocalConverter converter = LocalConverter.builder().officeManager(manager).build();
    // ======================实现文档转换=======================
    // 测试word文档转pdf
    // 创建输入流
    FileInputStream input = new FileInputStream("E:/tmp/word/test.docx");
    // 创建输出流
    FileOutputStream output = new FileOutputStream("E:/tmp/word/test.pdf");
    // 进行格式转换
    converter.convert(input).as(DefaultDocumentFormatRegistry.DOCX)
            .to(output).as(DefaultDocumentFormatRegistry.PDF).execute();
    // 关闭流
    output.close();
    input.close();
    manager.stop();
}

效果图

在这里插入图片描述

转换后

在这里插入图片描述

二、Spring Boot集成模式

jodconverter有对于Spring Boot的集成解决方案:jodconverter-spring-boot-starter

1 项目依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-spring-boot-starter</artifactId>
    <version>4.4.6</version>
</dependency>

2 配置文件

jodconverter:
  local:
    office-home: D:/Program Files/LibreOffice
    enabled: true
    port-numbers:
      - 8100
      - 8101
      - 8102
      - 8103

3 测试单例

@SpringBootTest
class SpringBootOfficeApplicationTests {

    @Resource
    private LocalConverter converter;
    @Test
    void contextLoads() throws IOException, OfficeException {
        // 测试word文档转pdf
        // 创建输入流
        FileInputStream input = new FileInputStream("E:/tmp/word/test.docx");
        // 创建输出流
        FileOutputStream output = new FileOutputStream("E:/tmp/word/test.pdf");
        // 进行格式转换
        converter.convert(input).as(DefaultDocumentFormatRegistry.DOCX)
                .to(output).as(DefaultDocumentFormatRegistry.PDF).execute();
        output.close();
        input.close();
    }

}

三、文档模板渲染输出

在基于java开发office项目中,需要完成一些文档数据的渲染和输出工作,例如将数据库中的数据渲染到表格中,然后输出pdf。

目前比较推荐的技术选型是

首先,刻画模板将模板需要填充部分特殊标记,然后转行为xml格式。

然后,利用模板引擎将数据与模板进行渲染。

最后,使用jodconverter转换为pdf输出。

目前比较推荐的模板引擎是freemarker

以word文档渲染后输出pdf为例

1 编写模板文件

在编写模板中,更推荐使用LibreOffice Writer是安装LibreOffice后自带的客户端。

在这里插入图片描述

在保存过程中,记得保存为:fodt格式的文件。

FODT文件是一种开放文档文本(Flat OpenDocument Text)文件的扩展名。OpenDocument是一种开放的文档标准,旨在提供一种用于创建和编辑文档的自由和开放的文件格式。FODT文件通常包含文本文档的内容,可以包括文字、格式设置、图像和其他与文档相关的元素。这个文件格式的一个常见用途是与LibreOffice和Apache OpenOffice等开源办公套件一起使用。

在这里插入图片描述

2 项目设计

2.1 项目依赖
<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-local</artifactId>
    <version>4.4.6</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.32</version>
</dependency>
2.2 核心逻辑

freemarker工具类

public class FreemarkerUtils {

    public static final Configuration CONFIGURATION;

    public static final String TEMPLATE_DIRECTORY = "E:/tmp/word";

    static {
        // 初始化
        CONFIGURATION = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        // 编码
        CONFIGURATION.setDefaultEncoding("UTF-8");
        //模板文件夹路径
        try {
            // CONFIGURATION.setClassForTemplateLoading(FreemarkerUtils.class, path);
            CONFIGURATION.setDirectoryForTemplateLoading(new File(TEMPLATE_DIRECTORY));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String rendering(String templateName, Map<String, Object> params) throws IOException, TemplateException {
        Writer writer = new StringWriter();
        Template template = CONFIGURATION.getTemplate(templateName);
        template.process(params, writer);
        writer.close();
        return writer.toString();
    }
}
// ======================实现文档转换=======================
// 测试word文档转pdf
Map<String, Object> map = new HashMap<>(3);
map.put("name", "张山");
map.put("age", 18);
map.put("text", "性格开朗,热情大方,富有正义感,勤奋好学,对工作认真负责。");
String dom = FreemarkerUtils.rendering("模板1.fodt", map);
// 创建输入流
ByteArrayInputStream input = new ByteArrayInputStream(dom.getBytes());
// 创建输出流
FileOutputStream output = new FileOutputStream("E:/tmp/word/模板1.pdf");
// 进行格式转换
converter.convert(input).as(DefaultDocumentFormatRegistry.DOCX)
        .to(output).as(DefaultDocumentFormatRegistry.PDF).execute();
2.3 效果展示

在这里插入图片描述

四、实现文档预览

如果文件格式转换和文档渲染是基于文件操作的话,文档预览是需要引出图片操作了。

文档预览需要让文档转换为pdf后再转换成图片进行查看。

实现pdf转换成图片推荐:apache.pdfbox

1 项目依赖

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-tools</artifactId>
    <version>2.0.27</version>
</dependency>

2 具体代码

// 创建字节输出流
ByteArrayOutputStream output = new ByteArrayOutputStream();
// 进行格式转换
converter.convert(input).as(DefaultDocumentFormatRegistry.DOCX)
        .to(output).as(DefaultDocumentFormatRegistry.PDF).execute();
// 创建文档
PDDocument document = PDDocument.load(output.toByteArray());
// 读取文档
PDFRenderer pdfRenderer = new PDFRenderer(document);
// 将文档每一张图片存入
for (int i = 0; i < document.getNumberOfPages(); i++) {
    BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, 600);
    ImageIO.write(bufferedImage, "PNG", new File("E:\\tmp\\word\\" + i + ".png"));
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SW线光源是真实的(点光源)

点光源在渲染下真实 点光源地板反射是对的

uni-app:获取元素宽高

效果 代码 这里我定义的宽为500px,高为200排序,控制台输出的结果是502,202。原因是我设置了上下左右宽度各为1px的border边框导致 核心代码分析 // const query uni.createSelectorQuery();表示创建了一个选择器查询实例。通过这个实例&#xff0c;你可以使用不同的方法来选择…

MYSQL——二、理论基础

Mysql 一、什么是数据库二、数据库管理系统(DBMS)三、数据库与文件系统的区别四、数据库技术构成及发展史1、技术构成2、发展史 五、常见数据库1、关系型数据库2、ACID原则3、关系型数据库的优缺点4、非关系型数据库5、非关系数据库的优点6、DBMS支持的数据模型7、运维对数据库…

C#中的for和foreach的探究与学习

一:语句及表示方法 for语句: for(初始表达式;条件表达式;增量表达式) {循环体 }foreach语句: foreach(数据类型 变量 in 数组或集合) {循环体 }理解 1.从程序逻辑上理解,foreach是通过指针偏移实现的(最初在-1位置,每循环一次,指针就便宜一个单位),而for循环是通

mac有必要用清理软件吗?有哪些免费的清理工具

当我们谈到Mac电脑时&#xff0c;很多人都会觉得它比Windows系统更加稳定和高效&#xff0c;也更不容易积累垃圾文件。但实际上&#xff0c;任何长时间使用的操作系统都会逐渐积累不必要的文件和缓存。那么&#xff0c;对于Mac用户来说&#xff0c;有必要使用专门的清理软件吗&…

十九,镜面IBL--BRDF积分贴图

再回顾下镜面部分的分割求和近似法 现在关注第二部分 最后可化为 也就是说&#xff0c;这两部分积分可以获得F0的系数和F0的偏差。 这两个值可以存储到BRDF积分贴图的RG部分。void main() { vec2 integratedBRDF IntegrateBRDF(TexCoords.x, TexCoords.y); FragColor …

react create-react-app v5 从零搭建(使用 npm run eject)

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

嵌入式Linux应用开发-第七章-野火-正点原子IMX6ULL的LED驱动程序

嵌入式Linux应用开发-第七章-野火-正点原子IMX6ULL的LED驱动程序 野火IMX6ULL的LED驱动程序7.4 野火/正点原子 IMX6ULL的 LED驱动程序7.4.1 原理图7.4.1.1 野火 fire_imx6ull-pro开发板7.4.1.2 正点原子 Atk_imx6ull-alpha开发板 7.4.2 所涉及的寄存器操作7.4.2.1 野火 fire_im…

2011 款宝马 318i 车发动机怠速游车、抖动

故障现象 一辆2011款宝马318i车&#xff0c;搭载N46B20E发动机&#xff0c;累计行驶里程约为9.5万km。该车因发动机怠速游车、抖动在其他维修厂维修&#xff0c;维修人员更换了火花塞、点火线圈、空气流量传感器、VANOS&#xff08;可变气门正时系统&#xff09;电磁阀、气门升…

竞赛无人机搭积木式编程(四)---2023年TI电赛G题空地协同智能消防系统(无人机部分)

竞赛无人机搭积木式编程&#xff08;四&#xff09; ---2023年TI电赛G题空地协同智能消防系统&#xff08;无人机部分&#xff09; 无名小哥 2023年9月15日 赛题分析与解题思路综述 飞控用户在学习了TI电赛往届真题开源方案以及用户自定义航点自动飞行功能方案讲解后&#x…

delphi 11 安装失败

delphi 11 安装遇到如下图&#xff1a; 解决方法&#xff1a; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 管理员身份&#xff01;&…

什么是数学建模(mooc笔记)

什么是数学建模 前提&#xff1a;我们数学建模国赛计划选择C题&#xff0c;故希望老师的教学中侧重与C题相关性大的模型及其思想进行培训。之后的学习内容中希望涉及以下知识点&#xff1a; logistic回归相关知识点。如&#xff1a;用法、适用、限制范围等。精学数学建模中常…

Kafka:介绍和内部工作原理

展示Kafka工作方式的简单架构。 什么是Kafka&#xff1f;为什么我们要使用它&#xff1f;它是消息队列吗&#xff1f; 它是一个分布式流处理平台或分布式提交日志。 Kafka通常用于实时流数据管道&#xff0c;即在系统之间传输数据&#xff0c;构建不断流动的数据转换系统和构…

WebPack5高级使用总结(三)

WebPack5高级使用总结 1、提升开发体检1.1、SourceMap1.2、使用 2、提升打包构建速度2.1、HotModuleReplacement2.2、oneOf2.3、Include/Exclude2.4、Cache2.5、Thead 3、减少代码体积3.1、Tree Shaking3.2、Babel3.3、Image Minimizer 4、优化代码运行性能4.1、Code Split4.1.…

038:mapboxGL 旋转地图(rotateTo)

第038个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中旋转地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…

科技资讯|AirPods Pro基于定位控制的自适应音频功能

在接受 TechCrunch 媒体采访时&#xff0c;苹果高管 Ron Huang 和 Eric Treski 谈到了关于 AirPods Pro 自适应音频&#xff08;Adaptive Audio&#xff09;功能的轶事&#xff0c;曾考虑基于 GPS 信号来控制自适应音频级别。 Treski 表示在探索自适应音频功能初期&#xff0…

电脑技巧:推荐一款桌面增强工具AquaSnap

目录 一、软件介绍 二、功能介绍 2.1 窗口边缘停靠 2.2、 窗口平铺 2.3、 窗口对齐 2.4 窗口自动拉伸 2.5、同时移动多个窗口 2.6 、支持窗口置顶 2.7、 鼠标快捷方式 2.8、 键盘快捷键 三、软件特色 四、软件获取 一、软件介绍 AquaSnap(界面增强软件)是一款功能…

Vue中自定义实现类似el-table的表格效果实现行颜色根据数据去变化展示

主要使用div布局实现表格效果&#xff0c;并使用渐变实现行背景渐变的效果 页面布局 <div class"table-wrap"><div class"table-title"><divv-for"(item, index) in tableColumn":key"index":prop"item.prop&qu…

嵌入式Linux应用开发-第七章-IMX6ULL-QEMU的LED驱动程序

嵌入式Linux应用开发-第七章-IMX6ULL-QEMU的LED驱动程序 IMX6ULL-QEMU的 LED驱动程序7.5 IMX6ULL-QEMU的 LED驱动程序7.5.1 看原理图确定引脚及操作方法7.5.2 所涉及的寄存器操作7.5.3 写程序7.5.4 上机实验7.5.5 课后作业 IMX6ULL-QEMU的 LED驱动程序 7.5 IMX6ULL-QEMU的 LED驱…

简化任务调度与管理:详解XXL-Job及Docker Compose安装

在现代应用程序开发中&#xff0c;任务调度和管理是至关重要的一部分。XXL-Job是一个强大的分布式任务调度平台&#xff0c;它使得任务的调度和管理变得更加轻松和高效。本文将介绍XXL-Job的基本概念&#xff0c;并详细演示如何使用Docker Compose进行快速安装和配置。 什么是X…