Java word转pdf Linux/windows跨平台 格式完美(利用命令行调用libreoffice)
参考了里面的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)相关推荐
- java实现word转pdf在线预览格式
java实现word转pdf在线预览格式 前段时间的项目里涉及了此功能,调研过一些方案,踩过一些坑,一一总结在此. java转pdf的方案很多,但是很多都要收费,转pdf也有一些格式方面的问题. 方案 ...
- Java word转pdf(替换变量,转图片)
菜鸟一个,不算原创,学习后的小结.有不足之处,请大家多多指教 Java word转pdf中遇到的问题: 1.在网上找到了一种方法,利用aspose-words,转换效果好但是有两个问题:一.转换时间长 ...
- aspose-word for java word转pdf 解决遇到的问题
aspose-word for java word转pdf 解决遇到的问题 具体问题 在项目中使用aspose-word 把word转换为pdf 有次一份63页的文档转换出来的pdf为72页,正常情况 ...
- java word 转 PDF|HTML|PNG
@[toc] java word 转 PDF|HTML|PNG word文档转换图片或pdf格式,需要使用(aspose-words-15.8.0-jdk16.jar) 链接:https://pan. ...
- java word转pdf 后通过 PdfReader 和 PdfStamper对pdf添加水印 通过poi等组件实现
所需jar包地址 <!-- java 读取word文件里面的加颜色的字体 转pdf 使用 --><dependency><groupId> e-iceblue &l ...
- Java WORD转换PDF 并添加水印 (附赠jar提取链接)
Java WORD转换PDF 并添加水印 直接上代码 实现功能 docx文档转换为PDF 转换之后排版不混乱 使用工具(Jar包) aspose-words-15.8.0-jdk16.jar(用于PD ...
- office 文档 在线预览功能实现(word,excel,pdf,ppt等多种格式)——使用https://view.xdocin.com/view 提示文档过期——基础积累
web实现office文档在线预览功能--基础积累 最近遇到一个需求,就是要实现多种文档链接的在线预览,最简单的方式就是通过window.open(url地址)的方式来实现. 但是如果要求是在一个弹窗 ...
- 每个 Linux 用户都应该知道的命令行技巧
每个 Linux 用户都应该知道的命令行技巧 原创 2015-09-11 伯乐在线 程序员的那些事 [伯乐在线导读]:有网友在问答网站Quora上提问:"有哪些省时小技巧,是每个Linux用 ...
- 《Linux指令从入门到精通》——4.3 Linux下全屏幕文本编辑器的命令行方式
本节书摘来自异步社区<Linux指令从入门到精通>一书中的第4章,第4.3节,作者:宋磊 , 宋馥莉 , 雷文利著,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
最新文章
- 机器学习PAL产品优势
- 三维等值面提取算法(Dual Contouring)
- python3之SQLAlchemy
- Windows 7技巧之Telnet组件消失之迷
- Android UI的优化
- 一張表的數據導入到另一張表
- android消息机制 Message, Looper,Handler
- 图论最短路:Bellman-Ford与其优化SPFA算法的一点理解
- oracle讲师视频教程,赵强老师:Oracle数据库系列视频课程
- 全网最新Linux全套教程
- 手把手带你玩转Spark机器学习-专栏介绍
- SQL数据库语句大全
- 超高精度UWB其实并不贵——UWB定位基站成本详解
- 关于Android P Auto锁屏Global.DEVICE_PROVISIONED
- 信号傅里叶变换后的实数和虚数部分理解
- 异常:Fatal error loading the DB: Invalid argument. Exiting
- react-native引入react-native-vector-icons
- 萝卜书摘显示服务器正在维护,萝卜书摘
- 【数据结构】Java版
- 微信公众号开发测试帐号