一.安装openoffice(windows版本)
官网下载地址:链接: openOffice
windows版本直接点击下载,等待3s自动下载,傻瓜式安装到指定目录即可
还是说下启动:
运行→cmd,输入:
cd C:\Program Files (x86)\OpenOffice 4\program
回车
再输入
soffice -headless -accept=“socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard
回车就可以了
接下来说下,linux版的,https://www.cnblogs.com/goodcheap/p/7929986.html,这个写的具体,可以参考一下
二.下载并导入jodconverter-2.2.2.jar包
百度网盘永久下载链接:
链接:https://pan.baidu.com/s/1d676kkjc8z_bgY8Oeed2Rw
提取码:2vsx
下载完成后放在项目的resources目录下,如图
引入pom文件:
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>juh</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>ridl</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>unoil</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.1</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.2</version>
<scope>system</scope> <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
<systemPath>${basedir}/src/main/resources/lib/jodconverter-2.2.2.jar</systemPath> <!--项目根目录下的lib文件夹下-->
</dependency>
三.代码部分
1.工具类
OpenOfficeUtil 工具类
package org.springblade.resource.util;
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import java.io.*;
import java.net.ConnectException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by Administrator
* on 2018/3/12
*/
public class OpenOfficeUtil {
private static OpenOfficeUtil doc2HtmlUtil;
/**
* 获取Doc2HtmlUtil实例
*/
public static synchronized OpenOfficeUtil getDoc2HtmlUtilInstance() {
if (doc2HtmlUtil == null) {
doc2HtmlUtil = new OpenOfficeUtil();
}
return doc2HtmlUtil;
}
/**
* 转换文件成html
*
* @param fromFileInputStream:
* @throws IOException
*/
public String file2Html(InputStream fromFileInputStream, String toFilePath,String type,String host,int port) throws IOException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timesuffix = sdf.format(date);
String docFileName = null;
String htmFileName = null;
if("doc".equals(type)){
docFileName = "doc_" + timesuffix + ".doc";
htmFileName = "doc_" + timesuffix + ".html";
}else if("docx".equals(type)){
docFileName = "docx_" + timesuffix + ".docx";
htmFileName = "docx_" + timesuffix + ".html";
}else if("xls".equals(type)){
docFileName = "xls_" + timesuffix + ".xls";
htmFileName = "xls_" + timesuffix + ".html";
}else if("ppt".equals(type)){
docFileName = "ppt_" + timesuffix + ".ppt";
htmFileName = "ppt_" + timesuffix + ".html";
}else{
return null;
}
File htmlOutputFile = new File(toFilePath + File.separatorChar + htmFileName);
File docInputFile = new File(toFilePath + File.separatorChar + docFileName);
if (htmlOutputFile.exists())
htmlOutputFile.delete();
htmlOutputFile.createNewFile();
if (docInputFile.exists())
docInputFile.delete();
docInputFile.createNewFile();
/**
* 由fromFileInputStream构建输入文件
*/
try {
OutputStream os = new FileOutputStream(docInputFile);
int bytesRead = 0;
byte[] buffer = new byte[1024 * 8];
while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fromFileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
OpenOfficeConnection connection = new SocketOpenOfficeConnection(host,port);
try {
connection.connect();
} catch (ConnectException e) {
System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
}
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(docInputFile, htmlOutputFile);
connection.disconnect();
// 转换完之后删除word文件
docInputFile.delete();
return htmFileName;
}
/**
* 转换文件成pdf
*
* @param fromFileInputStream:
* @throws IOException
*/
public String file2pdf(InputStream fromFileInputStream, String toFilePath,String type,String host,int port) throws IOException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timesuffix = sdf.format(date);
String docFileName = null;
String htmFileName = null;
if("doc".equals(type)){
docFileName = "doc_" + timesuffix + ".doc";
htmFileName = "doc_" + timesuffix + ".pdf";
}else if("docx".equals(type)){
docFileName = "docx_" + timesuffix + ".docx";
htmFileName = "docx_" + timesuffix + ".pdf";
}else if("xls".equals(type)){
docFileName = "xls_" + timesuffix + ".xls";
htmFileName = "xls_" + timesuffix + ".pdf";
}else if("ppt".equals(type)){
docFileName = "ppt_" + timesuffix + ".ppt";
htmFileName = "ppt_" + timesuffix + ".pdf";
}else{
return null;
}
File htmlOutputFile = new File(toFilePath + File.separatorChar + htmFileName);
File docInputFile = new File(toFilePath + File.separatorChar + docFileName);
if (htmlOutputFile.exists())
htmlOutputFile.delete();
htmlOutputFile.createNewFile();
if (docInputFile.exists())
docInputFile.delete();
docInputFile.createNewFile();
/**
* 由fromFileInputStream构建输入文件
*/
try {
OutputStream os = new FileOutputStream(docInputFile);
int bytesRead = 0;
byte[] buffer = new byte[1024 * 8];
while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fromFileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
OpenOfficeConnection connection = new SocketOpenOfficeConnection(host,port);
try {
connection.connect();
} catch (ConnectException e) {
System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
}
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(docInputFile, htmlOutputFile);
connection.disconnect();
// 转换完之后删除word文件
docInputFile.delete();
return htmFileName;
}
/**
* 执行前,请启动openoffice服务
* 进入$OO_HOME\program下
* 执行soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"
* @param xlsfile
* @param targetfile
* @throws Exception
*/
public static void fileConvertPdf(String xlsfile, String targetfile,String type,String host,int port)
throws Exception {
File xlsf = new File(xlsfile);
File targetF = new File(targetfile);
// 获得文件格式
DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
DocumentFormat pdfFormat = formatReg.getFormatByFileExtension("pdf");
DocumentFormat docFormat = null;
if("doc".equals(type) || "docx".equals(type)){
docFormat = formatReg.getFormatByFileExtension("doc");
}else if("xls".equals(type) || "xlsx".equals(type)){
docFormat = formatReg.getFormatByFileExtension("xls");
}else if("ppt".equals(type)){
docFormat = formatReg.getFormatByFileExtension("ppt");
}else{
docFormat = formatReg.getFormatByFileExtension("doc");
}
// stream 流的形式
InputStream inputStream = new FileInputStream(xlsf);
OutputStream outputStream = new FileOutputStream(targetF);
/**
*
*/
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
try {
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputStream, docFormat, outputStream, pdfFormat);
} catch (ConnectException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
connection = null;
}
}
}
/**
* 执行前,请启动openoffice服务
* 进入$OO_HOME\program下
* 执行soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" 或 soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
* @param inputStream
* @param outputStream
* @throws Exception
*/
public static void fileConvertPdf(InputStream inputStream, OutputStream outputStream,String type,String host,int port)
throws Exception {
// 获得文件格式
DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
DocumentFormat pdfFormat = formatReg.getFormatByFileExtension("pdf");
DocumentFormat docFormat = null;
if(".doc".equals(type) || ".docx".equals(type)){
docFormat = formatReg.getFormatByFileExtension("doc");
}else if(".xls".equals(type) || ".xlsx".equals(type)){
docFormat = formatReg.getFormatByFileExtension("xls");
}else if(".ppt".equals(type)){
docFormat = formatReg.getFormatByFileExtension("ppt");
}else if(".txt".equals(type)){
docFormat = formatReg.getFormatByFileExtension("txt");
}else if(".pdf".equals(type)){
docFormat = formatReg.getFormatByFileExtension("pdf");
}else{
docFormat = formatReg.getFormatByFileExtension("doc");
}
// stream 流的形式
OpenOfficeConnection connection = new SocketOpenOfficeConnection(host,port);
try {
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputStream, docFormat, outputStream, pdfFormat);
} catch (ConnectException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
connection = null;
}
}
}
public static void main(String[] args) throws Exception {
URL url=new URL("http://113.57.92.149:20834/oss/endpoint/downloadFile?fileId=1440516054841884673");//默认主页
InputStream is=url.openStream();//获取网络流
/*//获取网络资源,编码格式不同会出现乱码****************
byte[] flush=new byte[1024];
int len=0;
while(-1!=(len=is.read(flush)))
{
System.out.println(new String(flush,0,len));
}
is.close();
//获取网络资源,编码格式不同会出现乱码*****************/
//解决乱码的方法,转换流
BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));//解码方式,utf-8
String msg=null;
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\list\\1.xls"),"utf-8"));
while((msg=br.readLine())!=null)
{
bw.append(msg);
bw.newLine();
}
bw.flush();
bw.close();
br.close();
/*Doc2HtmlUtil coc2HtmlUtil = getDoc2HtmlUtilInstance();
String a = "D:\\poi-test\\exportExcel.xls";
String b = "D:\\poi-test\\exportExcel.pdf";
InputStream inputStream = new FileInputStream(a);
OutputStream outputStream = new FileOutputStream(b);
coc2HtmlUtil.fileConvertPdf(inputStream,outputStream,"xls");*/
/* File file = null;
FileInputStream fileInputStream = null;
file = new File("D:\\poi-test\\exportExcel.xls");
fileInputStream = new FileInputStream(file);
// coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/xls","xls");
coc2HtmlUtil.file2pdf(fileInputStream, "D:\\poi-test\\openOffice\\xls","xls");*/
/* file = new File("D:/poi-test/test.doc");
fileInputStream = new FileInputStream(file);
// coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/doc","doc");
coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/doc","doc");
file = new File("D:/poi-test/周报模版.ppt");
fileInputStream = new FileInputStream(file);
// coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/ppt","ppt");
coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/ppt","ppt");
file = new File("D:/poi-test/test.docx");
fileInputStream = new FileInputStream(file);
// coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/docx","docx");
coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/docx","docx");*/
}
}
FileUtil工具类
package org.springblade.resource.util;
import org.apache.commons.codec.digest.DigestUtils;
import org.springblade.common.utils.CopyInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class FileUtil {
public static String getInputStreamMd5(InputStream inputStream) {
String md5 = null;
try {
CopyInputStream copyInputStream=new CopyInputStream(inputStream);
InputStream copyInput=copyInputStream.getCopy();
md5 = DigestUtils.md5Hex(copyInput);
return md5;
} catch (IOException e) {
e.printStackTrace();
}
return md5;
}
/**
* 通过图片url返回图片Bitmap
* @param path
* @return
*/
public static InputStream returnBitMap(String path) {
URL url = null;
InputStream is = null;
try {
url = new URL(path);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//利用HttpURLConnection对象,我们可以从网络中获取网页数据.
conn.setDoInput(true);
conn.connect();
is = conn.getInputStream(); //得到网络返回的输入流
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
// public static void main(String[] args) {
// String url = "http://192.168.1.14:28088/000000-bladex/upload/20210319/239cc466ed7f7bd1f893b6fde964a0bd.png";
// String substring = url.substring(25);
// System.out.println(substring);
// }
}
2.controller层代码,根据文件地址转为文件流,将流文件转为pdf格式返回
@RequestMapping("/seeFile")
public void seeFile(Long fileId, HttpServletResponse response) {
try {
//根据文件id查询数据库文件的下载地址
Attach attach = attachService.selectById(fileId);
String fileUrl = "";
if (attach != null) {
fileUrl = baseUrl + attach.getLink();
}else{
log.info("根据文件id查询文件不存在!");
return;
}
String extName = fileUrl.substring(fileUrl.lastIndexOf("."));
InputStream inputStream = FileUtil.returnBitMap(fileUrl);
OutputStream outputStream = response.getOutputStream();
OpenOfficeUtil coc2HtmlUtil = OpenOfficeUtil.getDoc2HtmlUtilInstance();
// coc2HtmlUtil.fileConvertPdf(inputStream, outputStream, extName, "192.168.1.14", 28485); //openoffice的IP和端口
coc2HtmlUtil.fileConvertPdf(inputStream, outputStream, extName, "127.0.0.1", 8100); //openoffice的IP和端口
} catch (Exception e) {
log.error("--------将文件转为pdf失败----",e);
}
}
调用接口,可以直接返回pdf格式文件,效果如下: