背景

本篇文章主要是介绍我在使用docx4j过程中遇到的问题,并最终如何通过Libreoffice来实现pdf的转换。

问题

在使用docx4j转换pdf过程中发现word文档中表格、加粗样式无法实现,国内、国外都找了一遍也没找到解决办法,真实把人急坏了。如果有同学通过docx4j解决了下方问题的可以留言分享。

docx4j转换pdf主要出现的问题:

  1. 表格边框显示异常,无法跟word文档中保持一致
  2. word文档字体加粗,无法展示

解决方法

在花了好几天时间,无法解决docx4j转pdf样式问题后,决定更换转换方案,于是在网上查找其他pdf转换方案,发现Java生态中开源的三方包对word转pdf样式偏差都很大,商用版本偏差小但是不考虑。针对这种情况,决定更换思路,采用非依赖包方式实现,按照这个思路,进行网上搜索,果真发现可以通过调用wps等三方office软件来实现,沿着这个路径找到了开源的【Libreoffice】,使用Java,lang包下的【Runtime】类,执行命令行命令,实现pdf转换,通过这种方式转换后,pdf样式保持了与word文档一样的样式。

使用【Libreoffice】转换pdf需要先安装该软件。官网 Windows、Linux都有对应版本。安装后建议配置环境变量。如果不配置,则需要在执行命令行时指定全路径。具体安装步骤可以网上查找。

下面是,Java代码中,通过【Libreoffice】实现word转pdf代码:

    /**
* 通过libreoffice 转换word文档为pdf
* @param exportWordFile word文档
* @param exportPdfFile pdf文档
*/
public static void generateClausesPdf(File exportWordFile, File exportPdfFile) throws Exception {
String path = exportPdfFile.getAbsolutePath();
path = path.substring(0,path.lastIndexOf(File.separator));
try {
String command = String.format("soffice --headless --convert-to pdf --outdir %s %s", path, exportWordFile.getAbsolutePath());
log.info("libreoffice word转pdf command命令行:{},pdf绝对路径:{}",command,exportPdfFile.getAbsolutePath());
String redirectError = executeCommand(command);
if (StringUtil.isNotBlank(redirectError) || redirectError.contains("writer_pdf_Export")) {
log.error("libreoffice word转pdf失败,失败原因:{}", redirectError);
throw new RuntimeException("libreoffice word转pdf失败,失败原因:" + redirectError);
}
log.info("libreoffice word转pdf成功:::{}",redirectError);
} catch (Exception e) {
log.error("libreoffice word转pdf异常,异常信息,::: ",e);
throw e;
} }
/**
* 执行linux或windows命令
* @param command 命令
* @return 命令行执行结果
* @throws IOException io异常
* @throws InterruptedException 异常
*/
public static String executeCommand(String command) throws IOException, InterruptedException {
StringBuilder output = new StringBuilder();
Process p;
InputStreamReader inputStreamReader = null;
BufferedReader reader = null;
try {
p = Runtime.getRuntime().exec(command);
// 等待命令执行完成
p.waitFor();
inputStreamReader = new InputStreamReader(p.getErrorStream(), StandardCharsets.UTF_8);
reader = new BufferedReader(inputStreamReader);
String line = ""; // 处理错误输出
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
} finally {
IOUtils.closeQuietly(reader);
IOUtils.closeQuietly(inputStreamReader);
}
return output.toString();
}

docx4j转换pdf样式问题~Java Libreoffice转换pdf的更多相关文章

  1. 利用LibreOffice转换ppt、doc转化pdf

    利用LibreOffice转换ppt.doc转化pdf LibreOffice下载地址:  http://www.libreoffice.org/download/libreoffice-fresh/ ...

  2. libreoffice转换文件为pdf文件乱码问题解决办法

    最近系统需要一个office文件预览功能 解决方案为使用libreoffice将office文件转换为pdf文件,然后使用swftools将pdf文件转换为swf文件 最后在前台使用flexpaper ...

  3. java 将word转为PDF (100%与word软件转换一样)

    jdk环境:jdk_8.0.1310.11_64    (64位) 1.引入pom文件 <!-- word转pdf(依赖windows本地的wps) --> <dependency& ...

  4. 如何将 Java 项目转换成 Maven 项目

    本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明确的是,用 Maven 管理 Java 项目的确 ...

  5. 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。

    转:关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题. 关于JSONObje ...

  6. 转:如何将 Java 项目转换成 Maven 项目

    如何将 Java 项目转换成 Maven 项目 本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明 ...

  7. [错误解决] Libreoffice转换不成功,直接不做任何操作

    问题描述: Libreoffice在版本5.3.0之前都存在这个问题.现象是:当你运行其中一个LibreOffice的时候,再运行另外一个Libreoffice转换时,将不做任何操作. 解决方案: 如 ...

  8. inner join ,left join ,right join 以及java时间转换

    1.inner join ,left join 与 right join (from 百度知道) 例表aaid adate1    a12    a23    a3表bbid  bdate1     ...

  9. java 强制转换

    在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  10. eclipse下将普通的java工程转换成web工程

    开发过程中需要对普通的java工程转换成动态的web工程,网络上查询了资料很简单的几步操作就可以搞定,操作步骤如下: 编辑.project 修改以下配置 <nature>org.eclip ...

随机推荐

  1. [转]VC++中如何快速创建多层文件夹

    在创建目录时,原来的可用的方法是 _mkdir()或 BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurit ...

  2. 百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现

    本文由百度技术团队分享,引用自百度Geek说,原题"百度Android IM SDK组件能力建设及应用",本文进行了排版和内容优化. 1.引言 移动互联网时代,随着社交媒体.移动支 ...

  3. 阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠投递优化实践

    本文由阿里闲鱼技术团队景松分享,原题"到达率99.9%:闲鱼消息在高速上换引擎(集大成)",有修订和改动,感谢作者的分享. 1.引言 在2020年年初的时候接手了闲鱼的IM即时消息 ...

  4. kubernetes系列(十一) - 存储之configMap

    1. configMap简介 1.1 configMap的典型用法 1.2 configMap的表现形式 2. configMap的创建方式 2.1 kubectl create命令行创建 2.1.1 ...

  5. 2020-2024 IDEA安装+激活

    一.下载 1. IDEA各版本官方下载入口 IDEA官网下载地址 2. 选择左边,然后点击[20xx.x.x-Windows(exe)] PS: 如需下载特定版本,可以往下拉,都是选择[202x.x- ...

  6. Appium_WebDriverAgent设置

            在使用真机调试的时候犯了一个错误,我把WebDriverAgent 下载到本地的A目录下,然后进行build安装,这样在模拟器上执行是无法发现问题的,但是使用appium 在真机上执行 ...

  7. (六).NET6.0通用读取配置文件功能

    1.新增Microsoft.Extensions.Configuration包 在启动项目下,设置appsettings.json属性为始终复制 2.新建一个文件夹Common,用于存放工具类项目.并 ...

  8. .Net Core 管道底层源码实现

    在 .NET Core 中,请求处理管道是一个中间件(Middleware)链,用于处理 HTTP 请求并生成响应.管道的底层实现基于 Microsoft.AspNetCore.Http 命名空间中的 ...

  9. Redis学习笔记之spring-data-redis

    一.关于spring-data-redis spring-data-redis针对jedis提供了如下功能: 连接池自动管理,提供了一个高度封装的"RedisTemplate"类 ...

  10. 让 LLM 来评判 | 基础概念

    基础概念 这是 让 LLM 来评判 系列文章的第一篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技巧与提示 什么是评估模 ...