使用jacob将word转成PDF.docx
《使用jacob将word转成PDF.docx》由会员分享,可在线阅读,更多相关《使用jacob将word转成PDF.docx(20页珍藏版)》请在冰豆网上搜索。
![使用jacob将word转成PDF.docx](https://file1.bdocx.com/fileroot1/2023-1/21/5fbe38f9-58a2-4e2f-8e0b-caecdd7ebba0/5fbe38f9-58a2-4e2f-8e0b-caecdd7ebba01.gif)
使用jacob将word转成PDF
项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:
一、了解Jacob
先了解一下概念,JACOB就是JAVA-COMBridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。
这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。
下载地址:
二、Jacob安装
1、我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件
2、将压缩包解压后,Jacob.jar添加到Libraries中;
3、将Jacob.dll放至“WINDOWS\SYSTEM32”下面。
需要注意的是:
【使用IDE启动Web服务器时,系统读取不到Jacob.dll,例如用MyEclipse启动Tomcat,就需要将dll文件copy到MyEclipse安装目录的“jre\bin”下面。
一般系统没有加载到Jacob.dll文件时,报错信息为:
“java.lang.UnsatisfiedLinkError:
nojacobinjava.library.path”】
三、使用Jacob转换Word,Excel为HTML
JAVA代码:
Java代码
1.import java.io.BufferedReader;
2.import java.io.BufferedWriter;
3.import java.io.File;
4.import java.io.FileInputStream;
5.import java.io.FileNotFoundException;
6.import java.io.FileWriter;
7.import java.io.IOException;
8.import java.io.InputStreamReader;
9.
10.import com.jacob.activeX.ActiveXComponent;
11.import .Dispatch;
12.import .Variant;
13.
14.public class TransformFiletoHtml
15.{
16. int WORD_HTML = 8;
17. int WORD_TXT = 7;
18. int EXCEL_HTML = 44;
19.
20. /**
21. * WORD转HTML
22. * @param docfile WORD文件全路径
23. * @param htmlfile 转换后HTML存放路径
24. */
25. public void wordToHtml(String docfile, String htmlfile)
26. {
27. ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word
28. try
29. {
30. app.setProperty("Visible", new Variant(false));
31. Dispatch docs = app.getProperty("Documents").toDispatch();
32. Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { docfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch();
33. Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(WORD_HTML) }, new int[1]);
34. Variant f = new Variant(false);
35. Dispatch.call(doc, "Close", f);
36. }
37. catch (Exception e)
38. {
39. e.printStackTrace();
40. }
41. finally
42. {
43. app.invoke("Quit", new Variant[] {});
44. }
45. }
46.
47. /**
48. * EXCEL转HTML
49. * @param xlsfile EXCEL文件全路径
50. * @param htmlfile 转换后HTML存放路径
51. */
52. public void excelToHtml(String xlsfile, String htmlfile)
53. {
54. ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动excel
55. try
56. {
57. app.setProperty("Visible", new Variant(false));
58. Dispatch excels = app.getProperty("Workbooks").toDispatch();
59. Dispatch excel = Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[] { xlsfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch();
60. Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(EXCEL_HTML) }, new int[1]);
61. Variant f = new Variant(false);
62. Dispatch.call(excel, "Close", f);
63. }
64. catch (Exception e)
65. {
66. e.printStackTrace();
67. }
68. finally
69. {
70. app.invoke("Quit", new Variant[] {});
71. }
72. }
73.
74. /**
75. * /删除指定文件夹
76. * @param folderPath 文件夹全路径
77. * @param htmlfile 转换后HTML存放路径
78. */
79. public void delFolder(String folderPath)
80. {
81. try
82. {
83. delAllFile(folderPath); //删除完里面所有内容
84. String filePath = folderPath;
85. filePath = filePath.toString();
86. java.io.File myFilePath = new java.io.File(filePath);
87. myFilePath.delete(); //删除空文件夹
88. } catch (Exception e) {e.printStackTrace();}
89. }
90.
91. /**
92. * /删除指定文件夹下所有文件
93. * @param path 文件全路径
94. */
95. public boolean delAllFile(String path)
96. {
97. boolean flag = false;
98. File file = new File(path);
99. if (!
file.exists())
100. {
101. return flag;
102. }
103. if (!
file.isDirectory())
104. {
105. return flag;
106. }
107. String[] tempList = file.list();
108. File temp = null;
109. for (int i = 0; i < tempList.length; i++)
110. {
111. if (path.endsWith(File.separator))
112. {
113. temp = new File(path + tempList[i]);
114. }
115. else
116. {
117. temp = new File(path + File.separator + tempList[i]);
118. }
119. if (temp.isFile())
120. {
121. temp.delete();
122. }
123. if (temp.isDirectory())
124. {
125. delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件
126. delFolder(path + "/" + tempList[i]);//再删除空文件夹
127. flag = true;
128. }
129. }
130. return flag;
131. }
132.}
调用JAVA代码:
Java代码
1.public class Test1 {
2. public static void main(String[] args) {
3. // TODO Auto-generated method stub
4. TransformFiletoHtml trans = new TransformFiletoHtml();
5. trans.wordToHtml("D:
\\sinye.doc", "D:
\\sinye.html");
6. }
7.
8.}
只写了一个测试word转html的,excel转html的同理,在TransformFiletoHtml类中,写了两个方法,一个是删除文件夹的方法(delFolder()),一个是删除文件夹下所有文件的方法(delAllFile())。
写这个的目的是出于:
在word或者excel转html的过程中,除了生成制定的html页面外,jacob组件会生成一些转换html页面时相关的其它页面,但是这些相关的其它页面不是我们所需要的,因此想把它删除,其实不删除也可以,只是看着不爽,在测试中,发现,word有时不会生成这样的文件,而且即使生成了,也能删除掉,但是excel生成的文件却不能删除,还望高手们给予解答。
另外,在你将excel转换html时,如果你的代码没问题,转换时,老提示什么存在用户区域的安全设置这什么的,会让你选择继续转换,还是取消。
这是因为你转换的那个excel中写了保护,解决办法是在excel的工具->保护->允许用户编辑区域,删除里面的所有保护。
整体思路参考
上面的这篇文章使用jacob将word转换成HTML的,利用的是Word的另存为功能,在Office2007SP2之后,Office就可以另存为PDF了,可以使用这个方法将office另存为PDF文档。
具体代码可以参考上文里面的,另存为哪种类型是由newvariant()里面的参数决定的。
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(WORD_HTML) }, new int[1]);
newVariant(),这里面的根据传入的参数不同,可以另存为不同的类型,但是在网上搜索了一个并没有找到有关这个参数类型的一个说明,自己尝试了一下,结果如下:
0
Doc
1
Dot
2-5
Txt
6
Rtf
7
Txt
8、10
htm
11
Xml
12、16
Docx
13
Docm
14
Dotx
15
Dotm
17
Pdf
我使用的是office2010,不同版本的对应的应该不一样,我是写了这一小段程序来测试另存为的类型的。
Java代码
1.public class JacobTest {
2. public static void wordToPDF(String docfile, String toFile,int type) {
3. ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word
4. try {
5. app.setProperty("Visible", new Variant(false));
6. Dispatch docs = app.getProperty("Documents").toDispatch();
7. Dispatch doc = Dispatch.invoke(
8. docs,
9. "Open",
10. Dispatch.Method,
11. new Object[] { docfile, new Variant(false),
12. new Variant(true) }, new int[1]).toDispatch();
13. //new Variant(type),这里面的type的决定另存为什么类型的文件
14. Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
15. toFile, new Variant(type) }, new int[1]);
16. Variant f = new Variant(false);
17. Dispatch.call(doc, "Close", f);
18. } catch (Exception e) {
19. e.printStackTrace();
20. } finally {
21. app.invoke("Quit", new Variant[] {});
22. }
23. }
24.
25. public static void main(String[] args) {
26. //源文件全路径
27. String docfile ="D:
\\服务实施描述报告(企业门户).docx";
28. for (int i = 0; i < 18; i++) {
29. //些路径test为实际存在的目录,s后面为要另存为的文件名
30. String toFile="d:
\\test\\s"+i;
31. wordToPDF(docfile, toFile,i);
32. }
33. }
34.}
EXCEL转PDF(JAVA自动运行)
基本思想是,通过office2007自带的插件,保存为PDF,然后用ActiveXComponent实现,核心代码如下:
1>.转换类ExcelToPdf.java
packagecom.olive.util;
importjava.io.*;
importjava.util.Calendar;
importjava.util.Date;
importcom.jacob.activeX.ActiveXComponent;
import.ComThread;
import.Dispatch;
import.Variant;
publicclassExcelToPdf{
privateStringpath;
publicstaticbooleanrunFlag=false;
publicExcelToPdf(Stringpath){
this.path=path;
}
publicvoidsaveExcelAsPdf(StringfilePath,StringoutFile){
ComThread.InitSTA();
ActiveXComponentactcom=newActiveXComponent("Excel.Application");
try{
System.out.println((newDate()).toString()+" startconvertfrom:
"+filePath+"to"+outFile);
actcom.setProperty("Visible",newVariant(false));
Dispatchexcels=actcom.getProperty("Workbooks").toDispatch();
Dispatchexcel=Dispatch.invoke(excels,"Open",Dispatch.Method,
newObject[]{filePath,newVariant(false),newVariant(false)},
newint[9]).toDispatch();
Dispatch.invoke(excel,"SaveAs",Dispatch.Method,newObject[]{outFile,newVariant(57),newVariant(false),
newVariant(57),newVariant(57),newVariant(false),newVariant(true),newVariant(57),newVariant(false),
ne