当下做一个项目,就是各种操作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包  ,里面的结构应该是这样的

把jacob.jar 放到项目下  ,  然后 这里注意 把  两个后缀为dll的文件 放到 jre目录bin的里面   必须放进去  不然会报错(java.lang.NoClassDefFoundError) ,

实在不懂看此图    如果是默认安装 大概就是这个文件里面。

然后准备就绪  对应代码

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 blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }
}

第一种效果不错,windows . linux 都可以配置。 linux有兴趣可以自己查阅 。

第二种最好,几乎不管水印还是格式都完美的转换。 但是只能支持windows 。

第三种最方便, 效果和第一种差不多,但是速度稍微慢了一些。

以上方法,大多经过网上前辈们的博客博文的指点, 并加上本人亲测,完全可用。

JAVA-Word转PDF各种版本实现方式相关推荐

  1. java word 转 PDF|HTML|PNG

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

  2. Java连接MySQL8.0以上版本数据库方式

    Java连接MySQL8.0以上版本数据库方式 MySQL 8.0 开始数据库相比常用的 5.X 版本发生了比较大的变化,我们在连接数据库的过程中许多地方也要发生一些变化. 总结一下,想要利用 mys ...

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

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

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

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

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

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

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

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

  7. java html转pdf的几种方式_java 有关word,excel,pdf转换成html 有几种方式

    展开全部 java将Word/Excel/PDF文件转换成HTML整理 项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显e68a84323131333532363134313032313 ...

  8. java word转pdf,docx4j转pdf,docx4j导出pdf乱码,docx4j导出pdf丢失插画和图片,aspose将word转pdf 一共两种方法

    前言:一共有docx4j转pdf,aspose转pdf两种方式,不需要设置模板!!! java转pdf目前本人使用有两种方法,下面是方法代码 ps:因为本人是云桌面开发,所以只作截图,具体代码需要自己 ...

  9. JAVA-Word转PDF各种版本实现方式--亲测有效。。。持续更新中

    当下做一个项目,就是各种操作office,客户的需求总是各种不按常理,来需求就得搞啊.对JAVA操作office这方面真是头大,弟弟是真滴不懂不会啊.无奈只好试啊试的.网上一大堆好使的,一大堆不好使的 ...

最新文章

  1. spark spark streaming + kafka receiver方式消费消息
  2. HDU 5473 There was a kingdom 凸包 DP
  3. USACO 3.1 Agri-Net 最短网络 (最小生成树)(克鲁斯卡尔算法)
  4. WebLogic 12c 添加默认应用
  5. 当Project xCloud落地移动终端,云游戏靠手游撑起“当打之年”?
  6. 与机器学习算法有关的数据结构
  7. 程序员求助:被领导强行要求写Bug该怎么办?网友的回答让我笑翻
  8. composer的使用
  9. 微信模拟器不显示鼠标解决办法
  10. 在PC下载微信视频号里面的视频
  11. 国产框架MindSpore联合山水自然保护中心,寻找、保护「中华水塔」中的宝藏生命
  12. python使用smtplib群发工资条的两种方式(及群发只成功一条的问题)
  13. 国际商务英语学习[十七]
  14. python自动注册邮箱_163邮箱自动登陆python+selenium
  15. One PUNCH Man——变量显著性检验
  16. 一个农民工自学java找到工作的励志故事
  17. 优麒麟 19.04 即将发布,华为、阿里云、重大、360四大境像站鼎力支持!
  18. 智能优化算法之遗传算法(GA)的实现(基于二进制编码,Python附源码)
  19. 一口气发布十大建网利器,华为打算煲出怎样的5G味道?
  20. conda env create -f environment.yml报错ResolvePackageNotFound和Found conflicts的解决方案【已解决】

热门文章

  1. 正确的-配置Tomcat环境变量
  2. 云服务器可以用来做什么?
  3. armadillo 使用杂记
  4. 史上最全讲解:Spring详解
  5. 密码子偏好性分析~codonW,EMBOSS:CUSP(图文教程)
  6. 微信小程序animation
  7. 域名解析出现错误,该如何解决?
  8. TCPcopy安装、部署
  9. Unix/Linux编程:解析路径名------realpath()
  10. 光脚的快感!仅仅耐克1/8重,一个夏天不会臭脚!徒步不累脚!