从今天开始,我也要养成记录开发中遇到的问题和解决方法的好习惯!

最近开发一个Android项目,需要用到查看Word和Pdf文档的功能,由于Android没有直接显示Word和PDF文档的组件,只有一个Webview能查看html网页,所以决定将文档于服务器端转换为html,之后不论是在线预览还是下载到移动终端都可以直接查看了。

最近在网上查阅相关资料,找到利用Jacob来转换Word为html,除了占用CPU性能多一些,好像还不错(.doc和.docx都可以转换的!)。废话不多说,切入正题,这篇文章就先介绍转换Word为html的过程,Pdf还在研究当中,如果有结果我也会发出来!

"JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。"

Ps:Jacob只能用于windows系统,如果你的系统不是windows,建议使用Openoffice.org,这个是跨平台的,虽然我没用,但是应该不麻烦,就是需要先安装Openoffice这个软件,然后使用8100服务。至于Poi,说实话,我真不爱用,那个需要先解析word,然后自己覆写成html,工作量大不说,还得不偿失,因为很难保证转换的html内容的格式与原来word文档格式一致,并且.docx转换也很费劲。

1、到官网下载Jacob,目前最新版是1.17,地址链接:http://sourceforge.net/projects/jacob-project/

2、将压缩包解压后,Jacob.jar添加到Libraries中(先复制到项目目录中,右键单击jar包选择Build Path—>Add to Build Path);

3、将Jacob.dll放至当前项目所用到的“jre\bin”下面(比如我的Eclipse正在用的Jre路径是D:\Java\jdk1.7.0_17\jre\bin)。
Ps:我就是按照上面的步骤配置的,一点问题没有,但是有些人可能还会报错,比如:java.lang.UnsatisfiedLinkError: no jacob in java.library.path,这是系统没有加载到jacob.dll,网上解决方法是将Jacob.dll放至“WINDOWS\SYSTEM32”下面(我没试过,因为我的直接没问题)。

Java代码:

  1. public class JacobUtil {
  2.  
  3. // 8 代表word保存成html
  4. public static final int WORD_HTML = 8;
  5.  
  6. public static void main(String[] args) {
  7. String docfile = "C:\\Users\\無名\\Desktop\\xxx.doc";
  8. String htmlfile = "C:\\Users\\無名\\Desktop\\xxx.html";
  9. JacobUtil.wordToHtml(docfile, htmlfile);
  10. }
  11.  
  12. /**
  13. * WORD转HTML
  14. * @param docfile WORD文件全路径
  15. * @param htmlfile 转换后HTML存放路径
  16. */
  17. public static void wordToHtml(String docfile, String htmlfile) {
  18. // 启动word应用程序(Microsoft Office Word 2003)
  19. ActiveXComponent app = new ActiveXComponent("Word.Application");
  20. System.out.println("*****正在转换...*****");
  21. try {
  22. // 设置word应用程序不可见
  23. app.setProperty("Visible", new Variant(false));
  24. // documents表示word程序的所有文档窗口,(word是多文档应用程序)
  25. Dispatch docs = app.getProperty("Documents").toDispatch();
  26. // 打开要转换的word文件
  27. Dispatch doc = Dispatch.invoke(
  28. docs,
  29. "Open",
  30. Dispatch.Method,
  31. new Object[] { docfile, new Variant(false),
  32. new Variant(true) }, new int[1]).toDispatch();
  33. // 作为html格式保存到临时文件
  34. Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
  35. htmlfile, new Variant(WORD_HTML) }, new int[1]);
  36. // 关闭word文件
  37. Dispatch.call(doc, "Close", new Variant(false));
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. } finally {
  41. // 关闭word应用程序
  42. app.invoke("Quit", new Variant[] {});
  43. }
  44. System.out.println("*****转换完毕********");
  45. }
  46. }

EXCEL转HTML代码:

  1. package test;
  2.  
  3. import java.io.File;
  4.  
  5. import com.jacob.activeX.ActiveXComponent;
  6. import com.jacob.com.Dispatch;
  7. import com.jacob.com.Variant;
  8.  
  9. public class WordToHtml {
  10.  
  11. int WORD_HTML = 8;
  12. int WORD_TXT = 7;
  13. int EXCEL_HTML = 44;
  14.  
  15. /**
  16. * WORD转HTML
  17. * @param docfile WORD文件全路径
  18. * @param htmlfile 转换后HTML存放路径
  19. */
  20. public void wordToHtml(String docfile, String htmlfile) {
  21. ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word
  22. try {
  23. app.setProperty("Visible", new Variant(false));
  24. Dispatch docs = app.getProperty("Documents").toDispatch();
  25. Dispatch doc = Dispatch.invoke(
  26. docs,
  27. "Open",
  28. Dispatch.Method,
  29. new Object[] { docfile, new Variant(false),
  30. new Variant(true) }, new int[1]).toDispatch();
  31. Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
  32. htmlfile, new Variant(WORD_HTML) }, new int[1]);
  33. Variant f = new Variant(false);
  34. Dispatch.call(doc, "Close", f);
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. } finally {
  38. app.invoke("Quit", new Variant[] {});
  39. }
  40. }
  41.  
  42. /**
  43. * EXCEL转HTML
  44. * @param xlsfile EXCEL文件全路径
  45. * @param htmlfile 转换后HTML存放路径
  46. */
  47. public void excelToHtml(String xlsfile, String htmlfile) {
  48. ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动excel
  49. try {
  50. app.setProperty("Visible", new Variant(false));
  51. Dispatch excels = app.getProperty("Workbooks").toDispatch();
  52. Dispatch excel = Dispatch.invoke(
  53. excels,
  54. "Open",
  55. Dispatch.Method,
  56. new Object[] { xlsfile, new Variant(false),
  57. new Variant(true) }, new int[1]).toDispatch();
  58. Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {
  59. htmlfile, new Variant(EXCEL_HTML) }, new int[1]);
  60. Variant f = new Variant(false);
  61. Dispatch.call(excel, "Close", f);
  62. System.out.println("wordtohtml转换成功");
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. } finally {
  66. app.invoke("Quit", new Variant[] {});
  67. }
  68. }
  69.  
  70. /**
  71. * /删除指定文件夹
  72. * @param folderPath 文件夹全路径
  73. * @param htmlfile 转换后HTML存放路径
  74. */
  75. public void delFolder(String folderPath) {
  76. try {
  77. delAllFile(folderPath); // 删除完里面所有内容
  78. String filePath = folderPath;
  79. filePath = filePath.toString();
  80. java.io.File myFilePath = new java.io.File(filePath);
  81. myFilePath.delete(); // 删除空文件夹
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85. }
  86.  
  87. /**
  88. * /删除指定文件夹下所有文件
  89. * @param path 文件全路径
  90. */
  91. public boolean delAllFile(String path) {
  92. boolean flag = false;
  93. File file = new File(path);
  94. if (!file.exists()) {
  95. return flag;
  96. }
  97. if (!file.isDirectory()) {
  98. return flag;
  99. }
  100. String[] tempList = file.list();
  101. File temp = null;
  102. for (int i = 0; i < tempList.length; i++) {
  103. if (path.endsWith(File.separator)) {
  104. temp = new File(path + tempList[i]);
  105. } else {
  106. temp = new File(path + File.separator + tempList[i]);
  107. }
  108. if (temp.isFile()) {
  109. temp.delete();
  110. }
  111. if (temp.isDirectory()) {
  112. delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
  113. delFolder(path + "/" + tempList[i]);// 再删除空文件夹
  114. flag = true;
  115. }
  116. }
  117. return flag;
  118. }
  119.  
  120. public static void main(String[] args) {
  121. // TODO Auto-generated method stub
  122. WordToHtml wordtohtml = new WordToHtml();
  123. wordtohtml.wordToHtml("D://test.doc", "D://test.html");
  124. System.out.println("word转html成功");
  125. }
  126. }

本文转自:http://www.cnblogs.com/qingxinblog/articles/3399454.html

参考文章:http://blog.csdn.net/zhuyi412546724/article/details/5825983#

Java使用Jacob转换Word为HTML的更多相关文章

  1. java 使用jacob把word转pdf

    一.使用前要下载必要包及文件 链接: https://pan.baidu.com/s/1nvutQxb 密码: qgpi 二.引包和dll文件 1.引包:eclipse引包就不用说了,idea引包步骤 ...

  2. Java 使用 jacob 将 word 文档转换为 pdf 文件

    网上查询了许许多多的博客,说利用 poi.iText.Jsoup.jdoctopdf.使用 jodconverter 来调用 openOffice 的服务来转换等等,我尝试了很多种,但要么显示不完全, ...

  3. Java使用Jacob将Word、Excel、PPT转化成PDF

    使用Jacob将金山WPS转化成PDF,其中WPS文字使用KWPS.Aplication.Excel表格是KET.Application.演示文档是KWPP.Application,废话不多说,直接上 ...

  4. 【文件】使用jacob将word转换成pdf格式

    使用jacob将word转换成pdf格式   1.需要安装word2007或以上版本,若安装07版本学确保该版本已安装2downbank0204MicrosoftSaveasPDF_ XPS,否则安装 ...

  5. java通过jacob来读取word转换为htm格式

    转自:http://blog.csdn.net/chinapi_hzh/article/details/5798689 因为微软没有公开word源代码,所以直接用java流来读取word的后果是读出来 ...

  6. Java文件操作系列[3]——使用jacob操作word文档

    Java对word文档的操作需要通过第三方组件实现,例如jacob.iText.POI和java2word等.jacob组件的功能最强大,可以操作word,Excel等格式的文件.该组件调用的的是操作 ...

  7. Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下,通过Java 程序代码将Word转为PDF文档时,结果文档内容出现乱码该如何解决.具体可参考如下内容: 1.问题出现的背景 在Windows系统中,使用Spire.Doc ...

  8. Java转换Word文件到PDF文件

    使用Docx4j将Word文件转换为PDF文件: public static void convertDocxToPDF(String docxFilePath, String pdfPath) th ...

  9. jacob 操作word转pdf

    项目需要对上传的word及pdf进行在线预览,因基于jquery的pdf插件,很方面实现在线预览,而word实现在线预览费劲不少,于是想到在进行上传处理时,直接将word转成pdf,在预览时直接预览p ...

随机推荐

  1. HDU 1253:胜利大逃亡(简单三维BFS)

    pid=1253">胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  2. hql 多对多查询

    这种查询,hibernate 建议用 From Dealer s inner join fetch s.carSerieses cs  实现,注意这种实现只支持b.c,不支持b.cs. 如果要用b.c ...

  3. Redhat hadoop2.7.2安装笔记

    本次安装是在windows7环境下安装redhat虚拟机进行的,所须要的软件例如以下: VirtualBox-5.0.16-105871-Win.exe rhel-server-5.4-x86_64- ...

  4. 计算机的一些经典书籍CS经典书单

    c++: <c++程序设计> <c++primer> <effective c++> <more effective c++> <深入探索c++对 ...

  5. CUGBACM_Summer_Tranning1 二进制枚举+模拟+离散化

    整体感觉:这个组队赛收获还挺多的.自从期末考试以后已经有一个多月没有 做过组队赛了吧,可是这暑假第一次组队赛就找回了曾经的感觉.还挺不错的!继续努力!! 改进的地方:这次组队赛開始的时候题目比較难读懂 ...

  6. 实记处理mongodb的NUMA问题

    一次在启动mongodb的过程中,出现过NUMA这个问题, mongodb日志显示如下: WARNING: You are running on a NUMA machine. We suggest ...

  7. 高性能MySQL(四)

    Schema与数据类型优化 需要优化的数据类型 更小的通常更好 简单就好 尽量避免NULL 整数类型 存储整数,有TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT,分别使用8 ...

  8. 计算IMEI号的校验位

    计算IMEI号的校验位 移动设备国际识别码(IMEI:International Mobile Equipment Identification Number)是差别移动设备的标志,具有唯一性,贴在手 ...

  9. EasyDarwin手机直播转发快速显示问题之音频处理过程

    前言 在我们前面一篇<EasyDarwin手机直播是如何实现的快速显示视频的方法>中,我们描述到了EasyDarwin流媒体服务器端是如何对视频H.264进行缓冲,再以最快的方式将最新的视 ...

  10. 嵌套的EasyUI 怎么获取对象

    说明: 1.本篇文章介绍的是,怎么获取嵌套的Easyui 中的id为pageDetail的iframe对象 2.刚开始的页面效果如下图,是一个只有north,center区域的easyUI  easy ...