• Jacob官方的解释是Java COM Bridge,即java和com组件间的桥梁。
  • 需要注意的是,由于操作Jacob需要使用动态链接库(.dll)文件,所以Jacob仅支持在windows平台使用,Linux无法使用。
  • 使用jacob需要用的jar包,以及jacob.dll文件,也就是上面说到的com组件,博主分享两个版本,一个1.17,一个1.18,本人项目中用的是1.17
    1.17: 点击提取,密码:mwed
    1.18: 点击提取,密码:s4kg

入门了解后,在此说明用法以及博主在服务器端使用时遇到的坑:

1. 首先直接将jar放至lib目录下,将dll文件放至C:\Windows\System32目录下,本地直接测试成功,可以完美实现word,excel,ppt转换成pdf格式。

2. 将项目放至windows服务器后,如果报错找不到dll文件或者类,可通过以下方式解决:

  • 在确保C:\Windows\System32目录页有一份jacob.dll之外,还要在jdk的bin目录下放jacob版本对应的dll,在jdk的jre下的bin也放一份dll
  • 项目中导入相应的jar包后,如果找不到类,可以将jar拷贝一份至jdk\jre\lib\ext下,或者tomcat/lib下,都要尝试一下
  • 最后如果可以正常运行,没有报错,但pdf生成失败,如果不是权限的问题(即写入文件的权限),要在在"C:\Windows\SysWOW64\config\systemprofile"和"C:\Windows\System32\config\systemprofile"这两个路径下创建Desktop文件夹
  • 以上方法都要一步一步的试,出现相应问题找相应方法,不要一上来就把文件拷贝多份放至每个文件夹

相关代码:

public class PDFUtil {
	private static final int wdFormatPDF = 17;
	private static final int xlTypePDF = 0;
	private static final int ppSaveAsPDF = 32;
    private static final Integer WORD_TO_PDF_OPERAND = 17;
    private static final Integer PPT_TO_PDF_OPERAND = 32;
    private static final Integer EXCEL_TO_PDF_OPERAND = 0;
	public static void main(String[] args) {
		//path:原文档路径,也可以为一个网络地址
		//pdfPath为生成的pdf文件路径
		String path = "F:/test.doc";
		String pdfPath = "F:/test.pdf";
		boolean bo = PDFUtil.word2PDF(path,pdfPath);
		if(bo){
			System.out.println("转换完成!");
		}else{
			System.out.println("转换失败!");				
			 }
	}
	// word转换为pdf
	public static boolean word2PDF(String inputFile, String pdfFile) {
		try {
			// 打开word应用程序
			ActiveXComponent app = new ActiveXComponent("Word.Application");
			// 设置word不可见
			app.setProperty("Visible", false);
			// 获得word中所有打开的文档,返回Documents对象
			Dispatch docs = app.getProperty("Documents").toDispatch();
			// 调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
			Dispatch doc = Dispatch.call(docs, "Open", inputFile, false, true)
					.toDispatch();
			// 调用Document对象的SaveAs方法,将文档保存为pdf格式
			/*
			 * Dispatch.call(doc, "SaveAs", pdfFile, wdFormatPDF
			 * //word保存为pdf格式宏,值为17 );
			 */
			Dispatch.call(doc, "ExportAsFixedFormat", pdfFile, wdFormatPDF);// word保存为pdf格式宏,值为17
			// 关闭文档
			Dispatch.call(doc, "Close", false);
			// 关闭word应用程序
			app.invoke("Quit", 0);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	// excel转换为pdf
	public static boolean excel2PDF(String inputFile, String pdfFile) {
		try {
			ActiveXComponent app = new ActiveXComponent("Excel.Application");
			app.setProperty("Visible", false);
			Dispatch excels = app.getProperty("Workbooks").toDispatch();
			Dispatch excel = Dispatch.call(excels, "Open", inputFile, false,
					true).toDispatch();
			Dispatch.call(excel, "ExportAsFixedFormat", xlTypePDF, pdfFile);
			Dispatch.call(excel, "Close", false);
			app.invoke("Quit");
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	// ppt转换为pdf
	public static boolean ppt2PDF(String inputFile, String pdfFile) {
		try {
			ActiveXComponent app = new ActiveXComponent(
					"PowerPoint.Application");
			// app.setProperty("Visible", msofalse);
			Dispatch ppts = app.getProperty("Presentations").toDispatch();
 
			Dispatch ppt = Dispatch.call(ppts, "Open", inputFile, true,// ReadOnly
					true,// Untitled指定文件是否有标题
					false// WithWindow指定文件是否可见
					).toDispatch();
 
			Dispatch.call(ppt, "SaveAs", pdfFile, ppSaveAsPDF);
 
			Dispatch.call(ppt, "Close");
 
			app.invoke("Quit");
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	}
Logo

更多推荐