当前位置:   article > 正文

java将office文件转换为pdf文件的三种方法_java word转pdf

java word转pdf
  1. 方法1.poi读取doc + itext生成pdf (实现最方便,效果最差,跨平台)
  2. 方法2.jodconverter + openOffice (一般格式实现效果还行,复杂格式容易有错位,跨平台)
  3. 方法3.jacob + msOfficeWord + SaveAsPDFandXPS (完美保持原doc格式,效率最慢,只能在windows环境下进行)

由于方法1效果比较差,本文只介绍后两种方法

方法2:使用jodconverter来调用openOffice的服务来转换,openOffice有个各个平台的版本,所以这种方法跟方法1一样都是跨平台的。

  1. jodconverter的下载地址:http://www.artofsolving.com/opensource/jodconverter

pom文件添加依赖:

<dependency>
	<groupId>org.artofsolving.jodconverter</groupId>
	<artifactId>jodconverter-core</artifactId>
	<version>3.0-beta-4-jahia2</version>
</dependency>
  1. 安装openOffice,下载地址:http://www.openoffice.org/download/index.html
    安装完后要启动openOffice的服务

  2. application.properties配置文件

#openOffice安装目录
office.home=E:\\Program Files (x86)\\OpenOffice\\OpenOffice 4
  1. import java.io.File;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.ResourceBundle;
  4. import org.artofsolving.jodconverter.OfficeDocumentConverter;
  5. import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
  6. import org.artofsolving.jodconverter.office.OfficeManager;
  7. /**
  8. * @Description:jodconverter + openOffice
  9. * (一般格式实现效果还行,复杂格式容易有错位,跨平台)
  10. * 必须安装openOffice
  11. * @author xueyya
  12. * @date:2016年3月16日 上午9:26:57
  13. */
  14. public class JodConverter {
  15. /**
  16. * @Description:根据文件类型转换为pdf
  17. * @author xueyya
  18. * @date:2016316日 上午9:16:47
  19. * @param inputFile
  20. * @param pdfFile void
  21. * @throws UnsupportedEncodingException
  22. */
  23. public static void convert2PDF(File inputFile, File pdfFile) {
  24. OfficeManager officeManager = null;
  25. try {
  26. long start = System.currentTimeMillis();
  27. DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
  28. ResourceBundle resource = ResourceBundle.getBundle("application");
  29. String officeHome = resource.getString("office.home");
  30. officeHome = new String(officeHome.getBytes("ISO-8859-1"), "utf-8");
  31. config.setOfficeHome(officeHome);
  32. officeManager = config.buildOfficeManager();
  33. officeManager.start();
  34. OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
  35. System.out.println("转换文档到PDF..." + pdfFile.getPath());
  36. converter.convert(inputFile, pdfFile);
  37. long end = System.currentTimeMillis();
  38. System.out.println("转换完成..用时:" + (end - start) + "ms.");
  39. } catch (Exception e) {
  40. System.out.println(e.getMessage());
  41. } finally {
  42. if (officeManager != null) {
  43. officeManager.stop();
  44. }
  45. }
  46. }
  47. }

方法3:效果最好的一种方法,但是需要window环境,而且速度是最慢的,需要安装msofficeWord以及SaveAsPDFandXPS.exe(word的一个插件,用来把word转化为pdf)

  1. Office版本为office2007及以上,因为SaveAsPDFandXPS是微软为office2007及以上版本开发的插件
    SaveAsPDFandXPS下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=7 有Microsoft Office软件的可以不安装SaveAsPDFandXPS,Office软件会自带插件

  2. jacob 包下载地址:http://sourceforge.net/projects/jacob-project/
    注意 :把下载的JAR里面的jacob.dll拷贝至%JAVA_HOME%\jre\bin目录(不放会报错:java.lang.NoClassDefFoundError: Could not initialize class com.jacob.com.Dispatch)

pom文件添加依赖:

<dependency>
	<groupId>net.sf.jacob-project</groupId>
	<artifactId>jacob</artifactId>
	<version>1.18</version>
</dependency>
  1. 代码
    1. import java.io.File;
    2. import com.jacob.activeX.ActiveXComponent;
    3. import com.jacob.com.ComThread;
    4. import com.jacob.com.Dispatch;
    5. import com.jacob.com.Variant;
    6. /**
    7. * @Description:jacob + msOfficeWord + SaveAsPDFandXPS
    8. * (完美保持原doc格式,效率最慢,只能在windows环境下进行)
    9. * 而且速度是最慢的需要安装msofficeWord以及SaveAsPDFandXPS.exe
    10. * (word的一个插件,用来把word转化为pdf)
    11. * 有Office软件也行,自带上面插件
    12. * 把下载的JAR里面的jacob.dll拷贝至%JAVA_HOME%\jre\bin目录
    13. * @author xueyya
    14. * @date:2016年3月15日 下午3:35:08
    15. */
    16. public class Jacob {
    17. /** 转PDF格式值 */
    18. static final int WORD_FORMAT_PDF = 17;
    19. static final int EXCEL_FORMAT_PDF = 0;
    20. static final int PPT_FORMAT_PDF = 32;
    21. /**
    22. * @Description:根据文件类型转换为pdf
    23. * @author xueyya
    24. * @date:2016316日 上午9:16:47
    25. * @param inputFile
    26. * @param pdfFile void
    27. */
    28. public static void convert2PDF(String inputFile, String pdfFile) {
    29. String suffix = getFileSufix(inputFile);
    30. if (suffix.equals("doc") || suffix.equals("docx") || suffix.equals("txt")) {
    31. word2PDF(inputFile, pdfFile);
    32. } else if (suffix.equals("xls") || suffix.equals("xlsx")) {
    33. excel2PDF(inputFile, pdfFile);
    34. } else if (suffix.equals("ppt") || suffix.equals("pptx")) {
    35. ppt2PDF(inputFile, pdfFile);
    36. } else {
    37. System.out.println("文件格式不支持转换!");
    38. }
    39. }
    40. /**
    41. * @Description:word转pdf
    42. * @author xueyya
    43. * @date:2016315日 下午4:07:49
    44. * @param inputFile void
    45. * @param pdfFile
    46. */
    47. private static void word2PDF(String inputFile, String pdfFile) {
    48. System.out.println("启动Word...");
    49. long start = System.currentTimeMillis();
    50. ActiveXComponent app = null;
    51. Dispatch doc = null;
    52. try {
    53. // 创建一个word对象
    54. app = new ActiveXComponent("Word.Application");
    55. // 不可见打开word
    56. app.setProperty("Visible", new Variant(false));
    57. // 获取文挡属性
    58. Dispatch docs = app.getProperty("Documents").toDispatch();
    59. // 调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
    60. doc = Dispatch.call(docs, "Open", inputFile).toDispatch();
    61. System.out.println("打开文档..." + inputFile);
    62. System.out.println("转换文档到PDF..." + pdfFile);
    63. File tofile = new File(pdfFile);
    64. if(tofile.exists()) {
    65. tofile.delete();
    66. }
    67. // word保存为pdf格式宏,值为17
    68. Dispatch.call(doc, "SaveAs", pdfFile, WORD_FORMAT_PDF);
    69. long end = System.currentTimeMillis();
    70. System.out.println("转换完成..用时:" + (end - start) + "ms.");
    71. } catch (Exception e) {
    72. System.out.println("========Error:文档转换失败:" + e.getMessage());
    73. } finally {
    74. Dispatch.call(doc, "Close", false);
    75. System.out.println("关闭文档");
    76. if (app != null)
    77. app.invoke("Quit", new Variant[] {});
    78. }
    79. //如果没有这句话,winword.exe进程将不会关闭
    80. ComThread.Release();
    81. }
    82. /**
    83. * @Description:excel转pdf
    84. * @author xueyya
    85. * @date:2016315日 下午4:07:49
    86. * @param inputFile void
    87. * @param pdfFile
    88. */
    89. private static void excel2PDF(String inputFile, String pdfFile) {
    90. System.out.println("启动Excel...");
    91. long start = System.currentTimeMillis();
    92. ActiveXComponent app = null;
    93. Dispatch excel = null;
    94. try {
    95. // 创建一个excel对象
    96. app = new ActiveXComponent("Excel.Application");
    97. // 不可见打开excel
    98. app.setProperty("Visible", new Variant(false));
    99. // 获取文挡属性
    100. Dispatch excels = app.getProperty("Workbooks").toDispatch();
    101. // 调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
    102. excel = Dispatch.call(excels, "Open", inputFile).toDispatch();
    103. System.out.println("打开文档..." + inputFile);
    104. System.out.println("转换文档到PDF..." + pdfFile);
    105. File tofile = new File(pdfFile);
    106. if(tofile.exists()) {
    107. tofile.delete();
    108. }
    109. // Excel不能调用SaveAs方法
    110. Dispatch.call(excel, "ExportAsFixedFormat", EXCEL_FORMAT_PDF, pdfFile);
    111. long end = System.currentTimeMillis();
    112. System.out.println("转换完成..用时:" + (end - start) + "ms.");
    113. } catch (Exception e) {
    114. System.out.println("========Error:文档转换失败:" + e.getMessage());
    115. } finally {
    116. Dispatch.call(excel, "Close", false);
    117. System.out.println("关闭文档");
    118. if (app != null)
    119. app.invoke("Quit", new Variant[] {});
    120. }
    121. //如果没有这句话,winword.exe进程将不会关闭
    122. ComThread.Release();
    123. }
    124. /**
    125. * @Description:ppt转pdf
    126. * @author xueyya
    127. * @date:2016315日 下午4:07:49
    128. * @param inputFile void
    129. * @param pdfFile
    130. */
    131. private static void ppt2PDF(String inputFile, String pdfFile) {
    132. System.out.println("启动PPT...");
    133. long start = System.currentTimeMillis();
    134. ActiveXComponent app = null;
    135. Dispatch ppt = null;
    136. try {
    137. // 创建一个ppt对象
    138. app = new ActiveXComponent("PowerPoint.Application");
    139. // 不可见打开(PPT转换不运行隐藏,所以这里要注释掉)
    140. // app.setProperty("Visible", new Variant(false));
    141. // 获取文挡属性
    142. Dispatch ppts = app.getProperty("Presentations").toDispatch();
    143. // 调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
    144. ppt = Dispatch.call(ppts, "Open", inputFile, true, true, false).toDispatch();
    145. System.out.println("打开文档..." + inputFile);
    146. System.out.println("转换文档到PDF..." + pdfFile);
    147. File tofile = new File(pdfFile);
    148. if(tofile.exists()) {
    149. tofile.delete();
    150. }
    151. Dispatch.call(ppt, "SaveAs", pdfFile, PPT_FORMAT_PDF);
    152. long end = System.currentTimeMillis();
    153. System.out.println("转换完成..用时:" + (end - start) + "ms.");
    154. } catch (Exception e) {
    155. System.out.println("========Error:文档转换失败:" + e.getMessage());
    156. } finally {
    157. Dispatch.call(ppt, "Close");
    158. System.out.println("关闭文档");
    159. if (app != null)
    160. app.invoke("Quit", new Variant[] {});
    161. }
    162. //如果没有这句话,winword.exe进程将不会关闭
    163. ComThread.Release();
    164. }
    165. /**
    166. * @Description:获取文件后缀
    167. * @author xueyya
    168. * @date:2016316日 上午9:01:53
    169. * @param fileName
    170. * @return String
    171. */
    172. private static String getFileSufix(String fileName) {
    173. int splitIndex = fileName.lastIndexOf(".");
    174. return fileName.substring(splitIndex + 1);
    175. }
    176. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/388482
推荐阅读
相关标签
  

闽ICP备14008679号