documents4j 文档格式转换

news2025/2/25 15:25:37
  • 【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】
  • 【创作不易,点个赞就是对我最大的支持】

前言

仅作为学习笔记,供大家参考
总结的不错的话,记得点赞收藏关注哦!

目录

    • 前言
    • 1、documents4j 简介
    • 2、documents4j 的简单使用
    • 3、使用报错 :document4j框架使用问题-java.util.concurrent.ExecutionException: Could not complete conversion

1、documents4j 简介

document4j是一个用来进行文档格式转换的Java工具库,它通过借助本机中支持指定文件格式到目标文件格式转换的应用,来实现整个转换的过程。
document4j 实现了Microsoft Word、Excel的适配功能,可以将docx文件转换为pdf文件,并且在这个过程中不会出现非微软文件转换出现的扭曲情况。

document4j提供了一个简单的API,并且有两个具体的实现:

本地策略
在本地版的实现策略中,document4j将指定文件的转换任务委派给本机中相应的应用程序。因此,为了保证正常运行,这台机器需要在后台预装好支持转换的软件,诸如MicrosoftWord / Excel 。
document4j提供了一套简单易用的机制允许用户注册自定义的转换器,同时将具体的实现细节和Microsoft Word / Excel 进行对接结合。

远程策略
在远程版的实现策略中,document4j将文档的转换工作通过REST-API的方式提供到远程的服务端进行转换。在这个过程中,请求方将文件与相关的格式转换信息发送到服务器端,转换完毕后,转换完成的文件将通过response的方式传输回来。

对于document4j的用户来说,这些实现方式都是完全透明的。因此,用户完全可以在本地开发与测试的时候,采用本地版的实现策略,而在生产环境中,完全透明地切换成远程实现模式。所以,后台转换功能也更容易进行模拟操作。

2、documents4j 的简单使用

	<!--转pdf-->
		<dependency>
			<groupId>com.documents4j</groupId>
			<artifactId>documents4j-local</artifactId>
			<version>1.0.3</version>
		</dependency>
		<dependency>
			<groupId>com.documents4j</groupId>
			<artifactId>documents4j-transformer-msoffice-word</artifactId>
			<version>1.0.3</version>
		</dependency>

		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.10</version>
		</dependency>
/**
     * docx、xlsx、转pdf
     * @param docPath
     * @param pdfPath
     * @return
     */
    public static boolean docTopdf(String docPath, String pdfPath) {

        File inputWord = new File(docPath);
        File outputFile = new File(pdfPath);
        try {
            InputStream docxInputStream = new FileInputStream(inputWord);
            OutputStream outputStream = new FileOutputStream(outputFile);
            IConverter converter = LocalConverter.builder().build();
            String fileTyle=docPath.substring(docPath.lastIndexOf("."),docPath.length());//获取文件类型
            if(".docx".equals(fileTyle)){
                converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
            }else if(".doc".equals(fileTyle)){
                converter.convert(docxInputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute();
            }else if(".xls".equals(fileTyle)){
                converter.convert(docxInputStream).as(DocumentType.XLS).to(outputStream).as(DocumentType.PDF).execute();
            }else if(".xlsx".equals(fileTyle)){
                converter.convert(docxInputStream).as(DocumentType.XLSX).to(outputStream).as(DocumentType.PDF).execute();
            }
            docxInputStream.close();
            outputStream.close();
            inputWord.delete();
            System.out.println("pdf转换成功");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

3、使用报错 :document4j框架使用问题-java.util.concurrent.ExecutionException: Could not complete conversion

前言
使用document4j调用office将其它格式的文件转换成PDF时,有使用报错比如

java.util.concurrent.ExecutionException: Could not complete conversion
at com.documents4j.job.FailedConversionFuture.get(FailedConversionFuture.java:35)
… Caused by: com.documents4j.throwables.ConversionInputException: The input file
seems to be corrupt
at com.documents4j.util.Reaction$ConversionInputExceptionBuilder.make(Reaction.java:159)

出现这个错误是因为,如果我们把java程序当作window服务使用时,由于office不提供windows service的上下文环境,导致调用时输入流会中断。

解决办法
从document官方文档上得知

documents4j might malfunction when run as a Windows service together
with MS Office conversion. Note that MS Office does not officially
support execution in a service context. When run as a service, MS
Office is always started with MS Window’s local service account which
does not configure a desktop. However, MS Office expects a desktop to
exist in order to run properly. Without such a desktop configuration,
MS Office will start up correctly but fail to read any input file. In
order to allow MS Office to run in a service context, there are two
possible approaches of which the first approach is more recommended:

On a 32-bit system, create the folder
C:\Windows\System32\config\systemprofile\Desktop. On a 64-bit system,
create the folder C:\Windows\SysWOW64\config\systemprofile\Desktop.
Further information can be found on MSDN. You can manipulate MS
Window’s registry such that MS Office applications are run with
another account than the local service account. This approach is
documented on MSDN. Note that this breaks MS Window’s sandbox model
and imposes additional security threats to the machine that runs MS
Office.

当应用在window service上下文环境中运行,同时使用document4j的转换功能可能出现问题,MS Office不官方支持在上下文环境中使用,所以当我们的应用由服务的方式运行时,若使用document4j会报错。
一个典型的盒子,jenkins自动代部署时,执行java -jar test.jar启动test应用,应用就是在winows上下文环境中运行的。
有2种解决办法,第二种我没试过,尝试第一种有效,只介绍第一种方式。

win32位系统中,在C:\Windows\System32\config\systemprofile\位置下创建Desktop文件夹
win64位系统中,在C:\Windows\SysWOW64\config\systemprofile\位置下创建Desktop文件夹

创建完成后重启电脑即可。

协议

documents4j遵循Apache 2.0开源协议发布。

官方网站:http://documents4j.com
开源地址:https://github.com/documents4j/documents4j
其他方式实现 PDF转换:https://www.jb51.net/article/254043.htm

创作不易,点个赞就是对我最大的支持~


公众号:程序员温眉

在这里插入图片描述
CSDN:程序员温眉

每天进步一点点的程序员

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

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

相关文章

LeetCode刷题---两两交换链表中的节点

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/D9LVS 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述题目会把讲解部分分为3个部分…

电梯安全远程监控系统的主要作用和意义

电梯是现代城市生活中必不可少的交通工具&#xff0c;为了保证其安全可靠的运行&#xff0c;电梯运行监测系统应运而生。本文将介绍电梯安全远程监控的工作原理、重要性 一、电梯安全远程监控系统的作用   ◆实时监控和故障预警&#xff1a;电梯安全远程监控系统可以实时监测…

NodeJs脚手架(Koa)的简单使用

文章目录 前言一、与express的区别express-generator 提供的功能如下koa-generator 提供的功能如下两个生成器共同支持的项目骨架描述如下 二、使用步骤安装 Koa 生成器使用koa2创建项目PM2的使用 三、基础目录说明配置文件package.json入口文件 bin/www核心文件 app.jsroutes …

Python脚本模拟真实设备刷视频播放量、浏览量

简述 Python3脚本刷视频播放量 前情提示 系统:centOS7,8阿里云一折优惠云小站_专享特惠_云产品推荐-阿里云 宝塔8.x 一说 部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者…

【GIT】.gitignore 在忽略目录中放开某目录

示例&#xff1a;忽略build下面的所有目录&#xff0c;只放开build/ast2500-default/workspace/recipes-phosphor/ 目录 .gitignore 实现文件代码 # 忽略 build 目录下的所有目录 # 并放开build/ast2500-default/workspace/recipes-phosphor/ build/* !build/ast2500-defaul…

DenseNet分类网络改进--亲测有效

最近&#xff0c;我在做多分类问题。在针对基模型的选择中&#xff0c;我使用了DenseNet作为基本模型。我在阅读论文时&#xff0c;遇到了一种改进方式&#xff1a; 如上图所示&#xff0c;在全连接层之前引入SPP模块&#xff1a; 代码如下&#xff1a; SPP模块代码&#x…

系统运维工具KSysAK——让运维回归简单

系统运维工具KSysAK——让运维回归简单 1.基本信息 1.1概述 系统异常定位分析工具KSysAK是云峦操作系统研发及运维人员总结开发及运维经验&#xff0c;设计和研发的多个运维工具的集合&#xff0c;可以覆盖系统的日常监控、线上问题诊断和系统故障修复等常见运维场景。 工具…

Java---异常

文章目录 1. 异常概述2. try...catch3. Throwable成员方法4. 编译时异常和运行时异常区别5. 异常处理之throws6. 自定义异常7. throws和throw的区别 1. 异常概述 1. 异常&#xff1a;就是程序中出现了不正常的情况。 2. Error&#xff1a;严重问题&#xff0c;不需要处理。Exce…

揭秘MQTT:为何它是物联网的首选协议?

文章目录 MQTT 协议简介概览MQTT 与其他协议对比MQTT vs HTTPMQTT vs XMPP 为什么 MQTT 是适用于物联网的最佳协议&#xff1f;轻量高效&#xff0c;节省带宽可靠的消息传递海量连接支持安全的双向通信在线状态感知 MQTT 5.0 与 3.1.1MQTT 服务器MQTT 客户端 MQTT 协议简介 概…

亿胜盈科AT8236 刷式直流电机驱动器

AT8236是一款刷式直流电机驱动器&#xff0c;能够以高达6A的峰值电流双向控制电机。利用电流衰减模式&#xff0c;可通过对输入信号进行脉宽调制(PWM) 来控制电机转速&#xff0c;同时具备低功耗休眠模式。 AT8236集成同步整流功能&#xff0c;可显著降低系统功耗要求。内部保…

【鸿蒙应用开发】开发环境搭建及IDE安装使用

1.下载安装包 安装包下载地址&#xff1a; 点击跳转下载页面 可以根据自己的操作系统选择对应版本下载。 本文以Windows安装为例&#xff0c;Mac安装方式相同 2. 安装 下载好后&#xff0c;打开安装包&#xff0c;进入安装界面&#xff1a; 点击Next&#xff0c;进入安…

傻傻分不清楚的分区、分库、分表

一、分区 MySQL 在 5.1 时添加了对 分区&#xff08;即水平分区&#xff09; 的支持。MySQL 的物理数据存储在表空间文件&#xff08;.ibdata1和.ibd&#xff09;中&#xff0c;分区 的意思是指将同一表中不同行的记录分配到不同的物理文件中。有几个分区就有几个 .idb 文件。…

CPP-SCNUOJ-Problem P23. 计数排序(使用C/C++)

Problem P23. 计数排序&#xff08;使用C/C&#xff09; 计下标从 1 开始。有n 个取值范围在 [1,m] 的整数ai 。请将它们升序排序&#xff0c;设排序后数组为b 。为避免输出过长&#xff0c;请输出&#xff1a; 输入 输出 输出一个整数代表计算结果 样例 标准输入 10 3 1 …

智能液压传动综合实验台比例阀放大器

智能型液压传动实验台具有开发测试分析系统&#xff0c;通过对流量、压力、功率、转速、扭矩、位移、时间、温度--计算机人机画面 -- 计算机智能数据采集、分析、处理、--自动生产报表、曲线等一系列智能化动作后,完成各类常规的液压回路、马达、各类阀泵的动静态测试等实验.通…

C语言枚举详解,typedef简介(能看懂文字就能明白系列)

系列文章目录 C语言基础专栏 笔记详解 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、枚举类型的声明枚举常量三、枚举类型的优…

情怀零食店溢价严重,网友:情怀就是智商税,贵可以不买!

小时候的零食&#xff0c;是每个人心中无法抹去的甜蜜记忆。在广东&#xff0c;那些5毛钱的零食更是让无数人回味无穷。但近年来&#xff0c;这些情怀零食店的价格乱象却让不少人大呼“离谱”。 有市民反映&#xff0c;在一家主打怀旧主题的零食店内&#xff0c;三样商品竟然要…

ros2+UBUNTU读取STM32发送过来的数据(C++)

ATTENTION:一般ros2上位机访问STM32不是使用串口&#xff0c;即使树莓派有串口&#xff0c;我也不会用的&#xff0c;因为那还要去学习其他的语言&#xff0c;一般就是ros2---------ubs转串口-------STM32串口。 这个USB转串口&#xff0c;我们已经安装了CH340驱动了&#xff…

mall电商项目(学习记录2)

运行mall-admin Java项目 需要安装Redis&#xff0c;需要安装mysql&#xff0c;同时需要运行其项目提供的mall.sql 运行mall-admin后端程序 安装完Redis、mysql、HeidiSQL&#xff08;用于执行mall.sql&#xff0c;界面化操作高效直观&#xff09;、IntelliJ IDEA 运行mall-…

写给初学者的 HarmonyOS 教程 -- 页面路由(router)

页面路由&#xff08;router&#xff09;是指在应用程序中实现不同页面之间的跳转和数据传递。 HarmonyOS 提供了 Router 模块&#xff0c;通过不同的 url 地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。 类似这样的效果&#xff1a; 页面跳转是…

MISRA C 2012 标准浅析

MISRA(The Motor Industry Software Reliability Association)&#xff0c;汽车工业软件可靠性联会&#xff1b; 1994年&#xff0c;英国成立。致力于协助汽车厂商开发安全可靠的软件的跨国协会&#xff0c;其成员包括&#xff1a;AB汽车电子、罗孚汽车、宾利汽车、福特汽车、捷…