一、使用Jodconverter 利用OpenOffice3.X将Office文件转换成HTML,PDF
JAVA中使用jodconverter 利用OpenOffice3.X将office文件转换成HTML或是PDF
项目中,经常有用户将一些Office文档上传到应用中。之后如果需要查看的话,只能下载,才能查看。
为了达到更好的用户体验,需要不用下载Office文件就能在网页中查看文件内容。于是只好将Office文件转换成HTML或是PDF直接显示在网页中。就实现了在网页中直接查看的效果。
这种方法需要在服务端安装OpenOffice3.X的。但是比起需要在客户端安装office还是在服务器端安装更好一点。下面就是根据网上查找的一些资料,初步实现了转换工能。
第一步:下载 jodconverter-core-3.0-beta-4.zip
解开后导入下列jar
jodconverter-core-3.0-beta-4.jar
commons-cli-1.1.jar
commons-io-1.4.jar
json-20090211.jar
juh-3.2.1.jar
jurt-3.2.1.jar
ridl-3.2.1.jar
unoil-3.2.1.jar
导入相关的包:
第二步:下载OpenOffice3.X,安装
自已写转换调用:
1.OpenOfficeConverter.java
2.FileUtils.java
/**************************转换调用类********************/
package com.rd.utils;
import java.io.File;
import java.io.FileNotFoundException;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
public class OpenOfficeConverter {
private static OfficeManager officeManager;
private static String OFFICE_HOME = "C:\\Program Files (x86)\\OpenOffice.org 3";
private static int port[] = {8100};
private static final String HTML = ".html";
private static final String PDF = ".pdf";
/**
* 转换格式
* @param inputFile 需要转换的原文件路径
* @param fileType 要转换的目标文件类型 html,pdf
*/
public void convert(String inputFile, String fileType) {
String outputFile = FileUtils.getFilePrefix(inputFile)+fileType;
if(inputFile.endsWith(".txt")){
String odtFile = FileUtils.getFilePrefix(inputFile)+".odt";
if(new File(odtFile).exists()){
System.out.println("odt文件已存在!");
inputFile = odtFile;
}else{
try {
FileUtils.copyFile(inputFile,odtFile);
inputFile = odtFile;
} catch (FileNotFoundException e) {
System.out.println("文档不存在!");
e.printStackTrace();
}
}
}
startService();
System.out.println("进行文档转换转换:" + inputFile + " --> " + outputFile);
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
converter.convert(new File(inputFile),new File(outputFile));
stopService();
System.out.println();
}
public static void main(String[] args){
OpenOfficeConverter cov = new OpenOfficeConverter();
String inputFile= "d:\\使用手册1.4.doc";
cov.convert(inputFile,HTML);
}
public static void startService(){
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
try {
System.out.println("准备启动服务....");
configuration.setOfficeHome(OFFICE_HOME);//设置OpenOffice.org安装目录
configuration.setPortNumbers(port); //设置转换端口,默认为8100
configuration.setTaskExecutionTimeout(1000 * 60 * 5L);//设置任务执行超时为5分钟
configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);//设置任务队列超时为24小时
officeManager = configuration.buildOfficeManager();
officeManager.start(); //启动服务
System.out.println("office转换服务启动成功!");
} catch (Exception ce) {
System.out.println("office转换服务启动失败!详细信息:" + ce);
}
}
public static void stopService(){
System.out.println("关闭office转换服务....");
if (officeManager != null) {
officeManager.stop();
}
System.out.println("关闭office转换成功!");
}
}
/****************文件工具类****************************/
package com.rd.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileUtils {
public static String getFilePrefix(String fileName){
int splitIndex = fileName.lastIndexOf(".");
return fileName.substring(0, splitIndex);
}
public static String getFileSufix(String fileName){
int splitIndex = fileName.lastIndexOf(".");
return fileName.substring(splitIndex + 1);
}
public static void copyFile(String inputFile,String outputFile) throws FileNotFoundException{
File sFile = new File(inputFile);
File tFile = new File(outputFile);
FileInputStream fis = new FileInputStream(sFile);
FileOutputStream fos = new FileOutputStream(tFile);
int temp = 0;
try {
while ((temp = fis.read()) != -1) {
fos.write(temp);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二、Jacob来调用excel另存功能
需要下载jacob的包,该包还包含2个dll文件,一个是jacob-1.17-x64.dll,这个是64位的,还有一个是jacob-1.17-x86.dll文件,这个是32位的。将jar包包含到classpath目录,dll文件包含到jre/bin目录即可
package com.excel; import java.io.*; import java.util.Calendar; import java.util.Date; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class ExcelToPdf { private String path; public static boolean runFlag = false; public ExcelToPdf(String path) { this.path = path; } public void saveExcelAsPdf(String filePath, String outFile) { ComThread.InitSTA(); ActiveXComponent actcom = new ActiveXComponent("Excel.Application"); try { System.out.println((new Date()).toString() + " start convert from : " + filePath + " to " + outFile); actcom.setProperty("Visible", new Variant(false)); Dispatch excels = actcom.getProperty("Workbooks").toDispatch(); Dispatch excel = Dispatch.invoke( excels, "Open", Dispatch.Method, new Object[] { filePath, new Variant(false), new Variant(false) }, new int[9]).toDispatch(); Dispatch sheets = Dispatch.get((Dispatch) excel, "Sheets") .toDispatch(); // 获得几个sheet int count = Dispatch.get(sheets, "Count").getInt(); Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] { outFile, new Variant(57), new Variant(false), new Variant(57), new Variant(57), new Variant(false), new Variant(true), new Variant(57), new Variant(false), new Variant(true), new Variant(false) }, new int[1]); Dispatch.call(excel, "Close", new Variant(false)); if (actcom != null) { actcom.invoke("Quit", new Variant[] {}); actcom = null; } ComThread.Release(); File temp = new File(filePath); temp.renameTo(new File(filePath + "." + getDateStr())); temp = new File(filePath); temp.deleteOnExit(); temp = null; System.out.println((new Date()).toString() + " convert ok : " + filePath + " to " + outFile); } catch (Exception es) { es.printStackTrace(); } } public void listAllFile() { runFlag = true; String fileName = "", appdex = ""; File temp = null; try { File[] list = new File(path).listFiles(new FileFilter() { public boolean accept(File pathname) { boolean x = false; if (pathname.getName().toLowerCase().endsWith(".xls")) { x = true; } return x; } }); System.out.println((new Date()).toString() + " Total Convert File : " + list.length); for (int i = 0; i < list.length; i++) { fileName = list[i].getName().substring(0, list[i].getName().indexOf(".")); appdex = list[i].getName().substring( list[i].getName().indexOf(".")); temp = new File(path + fileName + ".pdf"); if (temp.exists()) { temp.renameTo(new File(path + fileName + "-" + getDateStr() + ".pdf")); } saveExcelAsPdf(path + fileName + appdex, path + fileName + ".pdf"); } } catch (Exception ex) { ex.printStackTrace(); } runFlag = false; } public String getDateStr() { Calendar cl = Calendar.getInstance(); cl.setTime(new Date()); String str = cl.get(Calendar.YEAR) + "" + (cl.get(Calendar.MONTH) + 1) + "" + cl.get(Calendar.DATE) + "" + cl.get(Calendar.HOUR) + "" + cl.get(Calendar.MINUTE) + "" + cl.get(Calendar.SECOND); return str; } public static void main(String[] args) { ExcelToPdf etp = new ExcelToPdf("e:/czc.xls"); etp.saveExcelAsPdf("e:/czc.xls", "E:/aa.pdf"); // byte[] data = etp.jacob_Office2Pdf1(null, null); // // ByteArrayInputStream bis=new ByteArrayInputStream(data); // try { // BufferedOutputStream bos = new BufferedOutputStream( // new FileOutputStream("E:/c.pdf")); // bos.write(data); // bos.close(); // } catch (FileNotFoundException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } try { BufferedInputStream bis=new BufferedInputStream(new FileInputStream("E:/bb.pdf0.pdf")); BufferedInputStream bis1=new BufferedInputStream(new FileInputStream("E:/bb.pdf1.pdf")); BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("E:/hb.pdf")); byte[] array=new byte[1024]; while(bis.read(array)!=-1){ bos.write(array); } bis.close(); while(bis1.read(array)!=-1){ bos.write(array); } bis1.close(); bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * 传进一个office文件的byte[]以及后缀,生成一个pdf文件的byte[] */ public byte[] jacob_Office2Pdf(byte[] srcFileBytes, String postfix) { String pdfTmplPath = "E:/bb.pdf"; String officeTmplPath = "E:/czc.xls"; File f = new File(officeTmplPath); ComThread.InitSTA(); ActiveXComponent app = new ActiveXComponent("Excel.Application"); app.setProperty("Visible", new Variant(false)); Object excels = app.getProperty("Workbooks").toDispatch(); Object excel = Dispatch.invoke( (Dispatch) excels, "Open", Dispatch.Method, new Object[] { officeTmplPath, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); // 获取activate表格 Dispatch currentSheet = Dispatch.get((Dispatch) excel, "ActiveSheet") .toDispatch(); Dispatch pageSetup = Dispatch.get(currentSheet, "PageSetup") .toDispatch(); Dispatch.put(pageSetup, "Orientation", new Variant(2)); try { // 如果第一个sheet为空则会抛出异常 Dispatch.call(currentSheet, "SaveAs", pdfTmplPath, new Variant(57)); } catch (Exception e1) { // TODO Auto-generated catch block // e1.printStackTrace(); // 自动调用第二个sheet Dispatch sheets = Dispatch.get((Dispatch) excel, "Sheets") .toDispatch(); // 获得几个sheet int count = Dispatch.get(sheets, "Count").getInt(); System.out.println(count); // System.out.println(count); Dispatch sheet = Dispatch.invoke(sheets, "Item", Dispatch.Get, new Object[] { new Integer(2) }, new int[1]).toDispatch(); pageSetup = Dispatch.get(sheet, "PageSetup").toDispatch(); Dispatch.put(pageSetup, "Orientation", new Variant(2)); Dispatch.call(sheet, "SaveAs", pdfTmplPath, new Variant(57)); Dispatch.call((Dispatch) excel, "Close", new Variant(false)); byte[] content; try { BufferedInputStream in = new BufferedInputStream( new FileInputStream(pdfTmplPath)); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] temp = new byte[1024]; int size = 0; while ((size = in.read(temp)) != -1) { out.write(temp, 0, size); } in.close(); content = out.toByteArray(); out.close(); File pdfFile = new File(pdfTmplPath); if (pdfFile.exists()) { pdfFile.delete(); } return content; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } finally { if (app != null) { app.invoke("Quit", new Variant[] {}); app = null; } ComThread.Release(); if (f.exists()) { f.delete(); } } Dispatch.call((Dispatch) excel, "Close", new Variant(false)); byte[] content; try { BufferedInputStream in = new BufferedInputStream( new FileInputStream(pdfTmplPath)); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] temp = new byte[1024]; int size = 0; while ((size = in.read(temp)) != -1) { out.write(temp, 0, size); } in.close(); content = out.toByteArray(); out.close(); File pdfFile = new File(pdfTmplPath); if (pdfFile.exists()) { pdfFile.delete(); } return content; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } public byte[] jacob_Office2Pdf1(byte[] srcFileBytes, String postfix) { String pdfTmplPath = "E:/bb.pdf"; String officeTmplPath = "E:/czc.xls"; ComThread.InitSTA(); ActiveXComponent app = new ActiveXComponent("Excel.Application"); app.setProperty("Visible", new Variant(false)); Object excels = app.getProperty("Workbooks").toDispatch(); Object excel = Dispatch.invoke( (Dispatch) excels, "Open", Dispatch.Method, new Object[] { officeTmplPath, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); // TODO Auto-generated catch block // e1.printStackTrace(); // 自动调用第二个sheet Dispatch sheets = Dispatch.get((Dispatch) excel, "Sheets").toDispatch(); // 获得几个sheet int count = Dispatch.get(sheets, "Count").getInt(); System.out.println(count); // System.out.println(count); Dispatch sheet = Dispatch.invoke(sheets, "Item", Dispatch.Get, new Object[] { new Integer(2) }, new int[1]).toDispatch(); Dispatch pageSetup = Dispatch.get(sheet, "PageSetup").toDispatch(); Dispatch.put(pageSetup, "Orientation", new Variant(2)); Dispatch.call(sheet, "SaveAs", pdfTmplPath, new Variant(57)); Dispatch.call((Dispatch) excel, "Close", new Variant(false)); byte[] content = null; BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(pdfTmplPath)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] temp = new byte[1024]; int size = 0; try { while ((size = in.read(temp)) != -1) { out.write(temp, 0, size); } in.close(); content = out.toByteArray(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } File pdfFile = new File(pdfTmplPath); if (pdfFile.exists()) { pdfFile.delete(); } return content; } }
以上是jacob利用另存把excel转成pdf文件,但是我没有找到多个sheet转化为一个pdf的方法,我使用遍历sheet保存多个pdf文件,通过itextpdf再将这多个PDF合成一个,效率偏低不过能够实现
package com.excel; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.PdfCopy; import com.lowagie.text.pdf.PdfImportedPage; import com.lowagie.text.pdf.PdfReader; public class PdfOperate { private static final int N = 3; public static void main(String[] args) { String[] files = {"E:/bb.pdf0.pdf", "E:/bb.pdf1.pdf"}; String savepath = "E:\\temp.pdf"; mergePdfFiles(files, savepath); //partitionPdfFile("C:\\a.pdf"); } public static void mergePdfFiles(String[] files, String savepath) { try { Document document = new Document(new PdfReader(files[0]).getPageSize(1)); PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath)); document.open(); for(int i=0; i<files.length; i++) { PdfReader reader = new PdfReader(files[i]); int n = reader.getNumberOfPages(); for(int j=1; j<=n; j++) { document.newPage(); PdfImportedPage page = copy.getImportedPage(reader, j); copy.addPage(page); } } document.close(); } catch (IOException e) { e.printStackTrace(); } catch(DocumentException e) { e.printStackTrace(); } } public static void partitionPdfFile(String filepath) { Document document = null; PdfCopy copy = null; try { PdfReader reader = new PdfReader(filepath); int n = reader.getNumberOfPages(); if(n < N) { System.out.println("The document does not have " + N + " pages to partition !"); return; } int size = n/N; String staticpath = filepath.substring(0, filepath.lastIndexOf("\\")+1); String savepath = null; ArrayList<String> savepaths = new ArrayList<String>(); for(int i=1; i<=N; i++) { if(i < 10) { savepath = filepath.substring(filepath.lastIndexOf("\\")+1, filepath.length()-4); savepath = staticpath + savepath + "0" + i + ".pdf"; savepaths.add(savepath); } else { savepath = filepath.substring(filepath.lastIndexOf("\\")+1, filepath.length()-4); savepath = staticpath + savepath + i + ".pdf"; savepaths.add(savepath); } } for(int i=0; i<N-1; i++) { document = new Document(reader.getPageSize(1)); copy = new PdfCopy(document, new FileOutputStream(savepaths.get(i))); document.open(); for(int j=size*i+1; j<=size*(i+1); j++) { document.newPage(); PdfImportedPage page = copy.getImportedPage(reader, j); copy.addPage(page); } document.close(); } document = new Document(reader.getPageSize(1)); copy = new PdfCopy(document, new FileOutputStream(savepaths.get(N-1))); document.open(); for(int j=size*(N-1)+1; j<=n; j++) { document.newPage(); PdfImportedPage page = copy.getImportedPage(reader, j); copy.addPage(page); } document.close(); } catch (IOException e) { e.printStackTrace(); } catch(DocumentException e) { e.printStackTrace(); } } }
相关推荐
标题中的“Office转pdf插件”指的是在Microsoft Office应用程序中使用的工具,允许用户将他们的文档、电子表格或演示文稿转换为PDF(Portable Document Format)格式。PDF是一种广泛接受的文件格式,它能够保留原始...
Java Office转PDF工具类是Java开发中用于将Office文档转换为PDF格式的一种解决方案。在Java环境中,Aspose是一个流行的库,提供了丰富的API来处理各种办公文档格式,包括Word、Excel、PowerPoint等,并且能够方便地...
标题中的“office转pdf功能”是指将Microsoft Office创建的文档(如Word、Excel或PowerPoint)转换成PDF(Portable Document Format)格式。这种转换在很多场景下非常实用,例如为了保持文档格式的一致性,或者方便...
完美支持Office转PDF,不需要安装office,只需要导入三个jar包就行,破解版无水印,里面写了对应的Demo,可以先看些里面的Aspose.txt
"Office转PDF和图片实例"这个主题主要关注如何将Microsoft Office创建的文档(如Word、Excel、PowerPoint等)转换为PDF格式,以及如何将这些文档导出为图片。这些操作在跨平台分享、保持文档一致性、打印预览或网络...
"java实现office转pdf.zip"这个压缩包包含了2019年7月20日某个项目中的代码,其主要功能就是将Office文件转换成PDF格式,而且是基于JDK1.8和一个名为JACOB的库来实现的。 **JACOB库介绍** JACOB(Java COM Bridge)...
office转换pdf类库,添加word,excel,ppt的dll引用,就可以直接调用本类库,得方法,转换office文档为pdf的文档,批量转换,同时,可以再转换成swf的格式,在线查看文档,类似于百度文库!
Java Web 实现 Office 转 PDF 是一个常见的需求,特别是在企业级应用中,为了保证文档在不同设备上的统一展示效果,通常会将Office文档转换为PDF格式。本资源包含了一个名为"OpenofficeDemo"的Java Web项目源码,...
本资源提供了一个完整的源码示例,专注于"Office转PDF"和"PDF转图片"的转换功能,这对于开发者来说是非常有价值的。 首先,让我们深入探讨“Office转PDF”的过程。在C#中,我们可以利用Microsoft Office Interop库...
标题提到的"2007office转pdf插件"是针对Microsoft Office 2007用户的一款工具,它允许用户将Office文档直接转换为PDF格式,无需额外的软件或复杂的操作步骤。 Microsoft Office 2007在发布之初并不支持直接保存为...
"Office转PDF"这个主题涉及将Microsoft Office格式(如Word、PowerPoint)的文件转换为Adobe PDF格式。这种转换有许多实用的理由,比如保持文件一致性、易于共享和打印,以及保护内容不被编辑。 首先,我们来了解...
"Office转PDF插件"就是专为了解决这一需求而设计的工具,它使得用户能够轻松地将Microsoft Office套件中的Word、Excel、PowerPoint等文件转换为PDF格式。以下将详细讨论这个插件的相关知识点。 首先,关于Office转...
在IT行业中,转换文档格式是一项常见的任务,尤其在办公环境中,从Microsoft Office格式转换为PDF是一种常见的需求。PDF(Portable Document Format)文件因其跨平台兼容性和防止编辑的特性而受到广泛应用。本文将...
"Office转PDF"是一个关键操作,因为PDF(Portable Document Format)文件格式能够保留文档的原始布局和样式,同时防止编辑,确保信息安全。Java作为一种广泛使用的编程语言,提供了多种方法来实现这个转换过程,特别...
"Office转PDF工具 非常好用 本人亲测"这个标题和描述表明,作者分享了一款经过他们亲自测试且效果良好的工具,用于将Office文档转换为PDF格式。 1. **为什么要将Office转换为PDF?** - **兼容性**:PDF文件在不同...
`OpenOffice office转pdf jar`是指使用Java语言开发的库,这个库可以与OpenOffice服务进行交互,完成从OpenOffice支持的文档格式到PDF的转换。 在Java环境中,`jar`文件(Java Archive)是用于封装Java类和资源的...
综上所述,要实现“Java office转pdf pdf转swf”,你需要安装和配置OpenOffice.org,了解如何启动和管理OpenOffice.org Server,利用JODConverter进行Office到PDF的转换,最后通过Swftools完成PDF到SWF的转换。...
"Office转PDF预览.rar"这个压缩包文件提供了关于将Microsoft Office文档转换为PDF格式的信息。在这个上下文中,我们将深入探讨Aspose.Office库的使用,以及如何将Word、Excel、PowerPoint等文件转换成PDF。 Aspose....
该工具是针对office转换为pdf开发的,相关的jar包都包含在其中,需要配置的文件也已经打包在压缩文件中,如果不知道如何进行操作,其中附有说明文件,代码都已经正常测试通过了。