JAVA-Word转PDF各种版本实现方式--亲测有效。。。持续更新中
- 工作小总结
- 时间:2023-05-25 10:24
- 2477人已阅读
🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号
当下做一个项目,就是各种操作office,客户的需求总是各种不按常理,来需求就得搞啊.对JAVA操作office这方面真是头大,弟弟是真滴不懂不会啊。无奈只好试啊试的。网上一大堆好使的,一大堆不好使的。整了一大堆word转PDF的方法。但是客户要求有水印,又不想花钱。硬着头皮试了一堆。虽说暂时还都没采用,但是收获也是有的。
以下都是亲测可用的(很多都是借鉴了前辈的博文)一来给自己用(毕竟我记性不好), 二来是希望能对看到本博客的帅哥靓妹们有点用处,免得一用都是不好使的。
以下方法都是转换结果比较可观的。。。。要用哪个自己斟酌
本博客的方法也许会不断的增加。有心自己看吧!!
----------------------------------------------------第一种方法 ------------------------------------------------
JobConverter + OpenOffice ( Windows系统下 )
JobConverter的jar包下载地址 : 点我去下载
OpenOffice的下载地址 : 点我去下载
OpenOffice 的安装路径自己定义。 代码中要使用对应路径调用启动服务 (此处友情提示)
import java.io.File; import java.io.IOException; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; // 将word格式的文件转换为pdf格式 public static void WordToPDF(String startFile, String overFile) throws IOException { // 源文件目录 File inputFile = new File(startFile); if (!inputFile.exists()) { System.out.println("源文件不存在!"); return; } // 输出文件目录 File outputFile = new File(overFile); if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().exists(); } // 调用openoffice服务线程 /** 我把openOffice下载到了 C:/Program Files (x86)/下 ,下面的写法自己修改编辑就可以**/ String command = "C:/Program Files (x86)/OpenOffice 4/program/soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\""; Process p = Runtime.getRuntime().exec(command); // 连接openoffice服务 OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100); connection.connect(); // 转换 DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(inputFile, outputFile); // 关闭连接 connection.disconnect(); // 关闭进程 p.destroy(); } public static void main(String[] args) { String start = "F:\\新建文件夹\\我是word测试文件.docx"; String over = "F:\\新建文件夹\\成了.pdf"; try { WordToPDF(start, over); } catch (IOException e) { e.printStackTrace(); } }
----------------------------------------------------第二种方法 ------------------------------------------------
SaveAsPDFandXPS + jacob (Windows操作系统下,电脑里有office)
SaveAsPDFandXPS 下载地址 : 点我去下载
jacob 的jar包 下载地址 : 点我去下载
先安装SaveAsPDFandXPS ,安装成功后 , 打开jacob的jar包 ,里面的结构应该是这样的
实在不懂看此图
如果是默认安装 大概就是这个文件里面。
import java.io.File; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; private static final int wdFormatPDF = 17;// PDF 格式 public static void wordToPDF(){ ActiveXComponent app = null; Dispatch doc = null; try { app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", new Variant(false)); Dispatch docs = app.getProperty("Documents").toDispatch(); //转换前的文件路径 String startFile = "F:\\新建文件夹\\我是word版本" + ".doc"; //转换后的文件路劲 String overFile = "F:\\新建文件夹\\我是转换后的pdf文件" + ".pdf"; doc = Dispatch.call(docs, "Open" , startFile).toDispatch(); File tofile = new File(overFile); if (tofile.exists()) { tofile.delete(); } Dispatch.call(doc,"SaveAs", overFile, wdFormatPDF); } catch (Exception e) { System.out.println(e.getMessage()); } finally { Dispatch.call(doc,"Close",false); if (app != null) app.invoke("Quit", new Variant[] {}); } //结束后关闭进程 ComThread.Release(); } public static void main(String[] args) { wordToPDF(); }
-----------------------------------------------第三种方法----------------------------------------------
这种方法纯属是搜刮出来的,因为测试好用。所以也弄了上来。这个里面依赖的jar包挺麻烦的。但是只要导入jar包就可以获得立竿见影的效果,缺点可能就速度上比较上面两种能慢一些,还有就是支持的是docx的文档格式 。
我把所有jar包一点一点的搜集起来整合了一下。(jar包的版本也会造成问题。所以我整合了一版)
大家可以去这里下载→ 整合版jar包下载地址
这个代码相比较上面两种就比较容易了。导入jar包就能用
废话不说。贴代码
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.MapUtils; import org.apache.poi.xwpf.converter.core.utils.StringUtils; 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; public class WordToPDF { /** * 将word文档, 转换成pdf, 中间替换掉变量 * @param source 源为word文档, 必须为docx文档 * @param target 目标输出 * @param params 需要替换的变量 * @throws Exception */ public static void wordConverterToPdf(InputStream source, OutputStream target, Map<String, String> params) throws Exception { wordConverterToPdf(source, target, null, params); } /** * 将word文档, 转换成pdf, 中间替换掉变量 * @param source 源为word文档, 必须为docx文档 * @param target 目标输出 * @param params 需要替换的变量 * @param options PdfOptions.create().fontEncoding( "windows-1250" ) 或者其他 * @throws Exception */ public static void wordConverterToPdf(InputStream source, OutputStream target, PdfOptions options, Map<String, String> params) throws Exception { XWPFDocument doc = new XWPFDocument(source); paragraphReplace(doc.getParagraphs(), params); for (XWPFTable table : doc.getTables()) { for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { paragraphReplace(cell.getParagraphs(), params); } } } PdfConverter.getInstance().convert(doc, target, options); } /** 替换段落中内容 */ private static void paragraphReplace(List<XWPFParagraph> paragraphs, Map<String, String> params) { if (MapUtils.isNotEmpty(params)) { for (XWPFParagraph p : paragraphs){ for (XWPFRun r : p.getRuns()){ String content = r.getText(r.getTextPosition()); if(StringUtils.isNotEmpty(content) && params.containsKey(content)) { r.setText(params.get(content), 0); } } } } } public static void main(String[] args) { String filepath = "F:\\新建文件夹\\我是word.docx"; String outpath = "F:\\新建文件夹\\我是结果.pdf"; InputStream source; OutputStream target; try { source = new FileInputStream(filepath); target = new FileOutputStream(outpath); Map<String, String> params = new HashMap<String, String>(); PdfOptions options = PdfOptions.create(); wordConverterToPdf(source, target, options, params); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
第一种效果不错,windows . linux 都可以配置。 linux有兴趣可以自己查阅 。
第二种最好,几乎不管水印还是格式都完美的转换。 但是只能支持windows 。
第三种最方便, 效果和第一种差不多,但是速度稍微慢了一些。
以上方法,大多经过网上前辈们的博客博文的指点, 并加上本人亲测,完全可用。
如果有什么疑问请提出 方便作者修改更新==>联系凯哥:公众号关注:kaigejava!谢谢各位帅哥靓妹们!