/**
* 文件在线预览
*
* @param response 响应对象
* @param url 文件相对路径
*/
public void fileOnline(HttpServletResponse response, String id) {
TCourseware tCourseware = tCoursewareMapper.get(id);
String filePath = "";
if (tCourseware.getFiletype().equals("1")) {
filePath = tCourseware.getPicurl1();
}
String fileType = filePath.substring(filePath.lastIndexOf(".") + 1);
// pdf|doc|docx|ppt|pptx|xls|xlsx
boolean isOffice = ("doc".equals(fileType) || "docx".equals(fileType) || "xls".equals(fileType)
|| "xlsx".equals(fileType) || "ppt".equals(fileType) || "pptx".equals(fileType));
boolean isPdf = ("pdf".equals(fileType));
fileType = "." + fileType;
try {
// office类型
if (isOffice) {
this.office2PDF(response, filePath, fileType);
}
// pdf类型
if (isPdf) {
response.setContentType("application/pdf");
FileInputStream in = new FileInputStream(new File(filePath));
OutputStream out = response.getOutputStream();
byte[] b = new byte[512];
while ((in.read(b)) != -1) {
out.write(b);
}
out.flush();
in.close();
out.close();
}
} catch (Exception e) {
}
}
/**
* office文件在线预览,支持doc、docx、xls、xlsx、ppt、pptx格式
*
* @param response 响应对象
* @param filePath 文件地址
*/
public void office2PDF(HttpServletResponse response, String filePath, String fileType) {
Process pro = null;
OpenOfficeConnection connection = null;
try {
//http://jointat-imgs.oss-cn-shenzhen.aliyuncs.com/Jointat-party2.0/test/img/2018-12-04 10:52:43/入党申请书模板.docx
// 文件保存位置
String furl = "D:\\PDfYUL";
File saveDir = new File(furl);
if (!saveDir.exists()) {
saveDir.mkdir();
}
String fileurl = saveDir + File.separator + "测试" + fileType;
File file = new File(fileurl);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if (fos != null) {
fos.close();
}
if (inputStream != null) {
inputStream.close();
}
File inputFile = new File(fileurl);
// 创建虚拟pdf文件
String destFile = "OpenOffice.PDF";
File outputFile = new File(destFile);
// OpenOffice安装目录
String OpenOffice_HOME = "C:\\Program Files (x86)\\OpenOffice 4";
// 启动OpenOffice的服务
String command = OpenOffice_HOME
+ "\\program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard";
pro = Runtime.getRuntime().exec(command);
connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
connection.connect();
// 将office文件转换为pdf
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
// 流形式返回到页面直接显示
response.setContentType("application/pdf");
FileInputStream in = new FileInputStream(new File(destFile));
OutputStream out = response.getOutputStream();
byte[] b = new byte[512];
while ((in.read(b)) != -1) {
out.write(b);
}
out.flush();
in.close();
out.close();
// 删除虚拟pdf文件
outputFile.delete();
inputFile.delete();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
// 关闭OpenOffice服务的进程
if (pro != null) {
pro.destroy();
}
}
}
/**
* 从输入流中获取字节数组
*
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
同样的方法 我在本地连接服务器的数据库做测试
和我部署到服务器上做测试
本地和服务器上的数据都是一样的 但是为什么会出现这个异常 在之前直接从阿里云服务器那数据流 转换从pdf的时候出现乱码 后来就换成了先从阿里上拿到本地在从本地转成pdf 就不会出现乱码了
这是上面报错地方的代码 163行的
这是上面报错地方的代码 122行的
之前的问题由于安全证书的问题直接改用阿里提供的下载方法不存在乱码和无法预览的问题