参考了里面的libreoffice的用法:https://blog.csdn.net/qwert678000/article/details/72770109

需求描述

最近在做word报表的自动生成,甲方要求要有pdf格式,且对样式要求特别严格。
上网搜了很多,发现在对word样式要求特别高的情况下,用libreoffice是特别好的选择。
基本上几秒钟10多页就出来。如果对样式要求不高,可以尝试其他的方法(aspose是个很好用的word->pdf的库)。

步骤

1.安装libreoffice(linux还需要装unoconv),windows到官网下载安装包,linux直接用命令行装即可:
https://zh-cn.libreoffice.org/get-help/install-howto/linux/(linux版及libreoffice中文官网)

2.验证安装是否成功
黑窗口直接敲命令,windows下:soffice --convert-to pdf example.docx
linux下: doc2pdf example.docx, windows需要添加path系统变量(C:\Program Files\LibreOffice 5\program),不然无法识别soffice命令

3.写代码

WordPdfUtils类:Word转Pdf主类

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;import org.apache.commons.collections4.MapUtils;
import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import fr.opensagres.xdocreport.utils.StringUtils;/*** @author Rocca**/
public class WordPdfUtils {protected static final Logger logger = LoggerFactory.getLogger(WordPdfUtils.class);public boolean wordConverterToPdf(String docxPath) throws IOException {File file = new File(docxPath);String path = file.getParent();try {String osName = System.getProperty("os.name");String command = "";if (osName.contains("Windows")) {//soffice --convert-to pdf  -outdir E:/test.docxcommand = "soffice --convert-to pdf  -outdir " + path + " " + docxPath;} else {command = "doc2pdf --output=" + path + File.separator + file.getName().replaceAll(".(?i)docx", ".pdf") + " " + docxPath;}String result = CommandExecute.executeCommand(command);
//          LOGGER.info("result==" + result);System.out.println("生成pdf的result==" + result);if (result.equals("") || result.contains("writer_pdf_Export")) {return true;}} catch (Exception e) {e.printStackTrace();throw e;}return false;}//测试用public static void main(String[] args) {try {// 建议都用/左斜杠这种,左斜杠是windows和linux通用的new WordPdfUtils().wordConverterToPdf("E:/test.docx");} catch (IOException e) {System.out.println("word转换成pdf时出错");e.printStackTrace();}}
}

CommandExecute类:执行linux或windows命令行

package com.bupt.nctc.utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;import org.apache.commons.io.IOUtils;/*** linux或windows命令执行*/
public class CommandExecute {//    public static void main(String[] args) {
//        CommandExecute obj = new CommandExecute();
//        String domainName = "www.baidu.com";
//        //in mac oxs
//        String command = "ping " + domainName;
//        //in windows
//        //String command = "ping -n 3 " + domainName;
//        String output = obj.executeCommand(command);
//        System.out.println(output);
//    }public static String executeCommand(String command) {StringBuffer output = new StringBuffer();Process p;InputStreamReader inputStreamReader = null;BufferedReader reader = null;try {p = Runtime.getRuntime().exec(command);p.waitFor();inputStreamReader = new InputStreamReader(p.getInputStream(), "UTF-8");reader = new BufferedReader(inputStreamReader);String line = "";while ((line = reader.readLine()) != null) {output.append(line + "\n");}//p.destroy();//这个一般不需要} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(reader);IOUtils.closeQuietly(inputStreamReader);}System.out.println(output.toString());return output.toString();}
}

备注:里面的main(0方法去掉注释后,可以用来做测试

4.解决中文乱码问题

复制windows的常用字体到linux下(常用字体如宋体、黑体)
可以先把字体文件夹复制到linux下的某个文件夹下,然后复制到目标位置:
如:sudo cp -r dir1 dir2
在我的电脑上是:sudo cp -r /home/nctc/fonts /usr/share/fonts就可以完成了。(试过2次都行)
上面是参考了这个https://blog.csdn.net/frylion/article/details/8207259把字体复制到/usr/share/fonts下。

Java word转pdf Linux/windows跨平台 格式完美(利用命令行调用libreoffice)相关推荐

  1. java实现word转pdf在线预览格式

    java实现word转pdf在线预览格式 前段时间的项目里涉及了此功能,调研过一些方案,踩过一些坑,一一总结在此. java转pdf的方案很多,但是很多都要收费,转pdf也有一些格式方面的问题. 方案 ...

  2. Java word转pdf(替换变量,转图片)

    菜鸟一个,不算原创,学习后的小结.有不足之处,请大家多多指教 Java word转pdf中遇到的问题: 1.在网上找到了一种方法,利用aspose-words,转换效果好但是有两个问题:一.转换时间长 ...

  3. aspose-word for java word转pdf 解决遇到的问题

    aspose-word for java word转pdf 解决遇到的问题 具体问题 在项目中使用aspose-word 把word转换为pdf 有次一份63页的文档转换出来的pdf为72页,正常情况 ...

  4. java word 转 PDF|HTML|PNG

    @[toc] java word 转 PDF|HTML|PNG word文档转换图片或pdf格式,需要使用(aspose-words-15.8.0-jdk16.jar) 链接:https://pan. ...

  5. java word转pdf 后通过 PdfReader 和 PdfStamper对pdf添加水印 通过poi等组件实现

    所需jar包地址 <!-- java 读取word文件里面的加颜色的字体 转pdf 使用 --><dependency><groupId> e-iceblue &l ...

  6. Java WORD转换PDF 并添加水印 (附赠jar提取链接)

    Java WORD转换PDF 并添加水印 直接上代码 实现功能 docx文档转换为PDF 转换之后排版不混乱 使用工具(Jar包) aspose-words-15.8.0-jdk16.jar(用于PD ...

  7. office 文档 在线预览功能实现(word,excel,pdf,ppt等多种格式)——使用https://view.xdocin.com/view 提示文档过期——基础积累

    web实现office文档在线预览功能--基础积累 最近遇到一个需求,就是要实现多种文档链接的在线预览,最简单的方式就是通过window.open(url地址)的方式来实现. 但是如果要求是在一个弹窗 ...

  8. 每个 Linux 用户都应该知道的命令行技巧

    每个 Linux 用户都应该知道的命令行技巧 原创 2015-09-11 伯乐在线 程序员的那些事 [伯乐在线导读]:有网友在问答网站Quora上提问:"有哪些省时小技巧,是每个Linux用 ...

  9. 《Linux指令从入门到精通》——4.3 Linux下全屏幕文本编辑器的命令行方式

    本节书摘来自异步社区<Linux指令从入门到精通>一书中的第4章,第4.3节,作者:宋磊 , 宋馥莉 , 雷文利著,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

最新文章

  1. 机器学习PAL产品优势
  2. 三维等值面提取算法(Dual Contouring)
  3. python3之SQLAlchemy
  4. Windows 7技巧之Telnet组件消失之迷
  5. Android UI的优化
  6. 一張表的數據導入到另一張表
  7. android消息机制 Message, Looper,Handler
  8. 图论最短路:Bellman-Ford与其优化SPFA算法的一点理解
  9. oracle讲师视频教程,赵强老师:Oracle数据库系列视频课程
  10. 全网最新Linux全套教程
  11. 手把手带你玩转Spark机器学习-专栏介绍
  12. SQL数据库语句大全
  13. 超高精度UWB其实并不贵——UWB定位基站成本详解
  14. 关于Android P Auto锁屏Global.DEVICE_PROVISIONED
  15. 信号傅里叶变换后的实数和虚数部分理解
  16. 异常:Fatal error loading the DB: Invalid argument. Exiting
  17. react-native引入react-native-vector-icons
  18. 萝卜书摘显示服务器正在维护,萝卜书摘
  19. 【数据结构】Java版
  20. 微信公众号开发测试帐号

热门文章

  1. 反证法在计算机领域,人工智能的基础研究领域——问题求解、逻辑推理与定理证明...
  2. 都在发做圣诞树,我来点不一样的,用python给对象戴一顶圣诞帽
  3. 18650锂电池知识全解析
  4. 几行代码爬取喜马拉雅音乐
  5. 没有比脚更长的路 没有比人更高的山
  6. vbs过程参数--byref和byval
  7. 1.0、Python概述
  8. 这样去做信用贷款违约预测项目,效果提升明显
  9. 一道经典SQL笔试题(求各部门最高薪水的部门名称、员工姓名以及薪水)
  10. 【Tools】P4V基础操作