Java利用Jacob实现excel,ppt,word转pdf 及jacob遇到的坑
Jacob官方的解释是Java COM Bridge,即java和com组件间的桥梁。需要注意的是,由于操作Jacob需要使用动态链接库(.dll)文件,所以Jacob仅支持在windows平台使用,Linux无法使用。使用jacob需要用的jar包,以及jacob.dll文件,也就是上面说到的com组件,博主分享两个版本,一个1.17,一个1.18,本人项目中用的是1.171.17: ...
·
- 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;
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)