利用openoffice+jodconverter-code-3.0-bate4实现ppt转图片
本文实例为大家分享了openoffice+jodconverter-code-3.0-bate4实现ppt转图片的具体代码,供大家参考,具体内容如下
安装openoffice4 (用于把文档(ppt)转成pdf)根据系统的位数安装
使用jodconverter-core3.0-beta-4(要上传maven本地仓库)
安装ImageMagick:yuminstallImageMagick(用于pdf转图片)
安装pdftotext 用于提取文字大纲 yum install poppler-utils
perl脚本(用于提取pdf文档的文字大纲)
使用jodconverter调用OpenOffice将office文档转换为PDF时。如果转换程序异常中止而OpenOffice并没有停止运行的话。
openoffice
1、启动tomcat时,启动openoffice服务(个人感觉有风险问题)
2、手工用命令,启动openoffice服务,在使用链接服务(推荐)
packagecom.document.servers.impl;
importjava.io.File;
importjava.net.ConnectException;
importjavax.annotation.PostConstruct;
importjavax.annotation.PreDestroy;
importorg.artofsolving.jodconverter.OfficeDocumentConverter;
importorg.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
importorg.artofsolving.jodconverter.office.ExternalOfficeManagerConfiguration;
importorg.artofsolving.jodconverter.office.OfficeConnectionProtocol;
importorg.artofsolving.jodconverter.office.OfficeManager;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Service;
//importcom.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
//importcom.artofsolving.jodconverter.DocumentConverter;
//importcom.artofsolving.jodconverter.DocumentFamily;
//importcom.artofsolving.jodconverter.DocumentFormat;
//importcom.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
//importcom.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
//importcom.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
importcom.document.servers.OfficeService;
/**
*linux下:
*cd/opt/openoffice4/program
*./soffice"-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager"-nologo-headless-nofirststartwizard&
*/
@Service("officeService")
publicclassOfficeServiceImplimplementsOfficeService{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(OfficeServiceImpl.class);
privateOfficeManagerofficeManager;
privateOfficeDocumentConverterdocumentConverter;
//@PostConstruct
//publicvoidinit()throwsException{
////TODOAuto-generatedmethodstub
//officeManager=newDefaultOfficeManagerConfiguration().setOfficeHome("/opt/openoffice4").buildOfficeManager();
//
//documentConverter=newOfficeDocumentConverter(officeManager);
////officeManager.stop();
//
//logger.warn("openofficestarting....");
//try{
//officeManager.start();
//logger.warn("openofficestarted");
//}catch(Exceptione){
//logger.error("officestartfailed:{}",e);
//}
//}
//
//@PreDestroy
//publicvoiddestroy()throwsException{
////TODOAuto-generatedmethodstub
//logger.info("shutdownofficeservice....");
//if(officeManager!=null){
//try{
//
//officeManager.stop();
//logger.info("officeclosed");
//}catch(Exceptione){
//logger.error("officeclosefailed:{}",e);
//}
//}
//}
//publicvoidconvert(Stringinputfilename,Stringoutputfilename){
//logger.info("convert...."+inputfilename+"to"+outputfilename);
//documentConverter.convert(newFile(inputfilename),newFile(outputfilename));
//}
publicvoidmanualConvert(Stringinputfilename,Stringoutputfilename){
logger.info("convert...."+inputfilename+"to"+outputfilename);
//connecttoanOpenOffice.orginstancerunningonport8100
ExternalOfficeManagerConfigurationexternalProcessOfficeManager=new
ExternalOfficeManagerConfiguration();
externalProcessOfficeManager.setConnectOnStart(true);
externalProcessOfficeManager.setPortNumber(8100);
officeManager=externalProcessOfficeManager.buildOfficeManager();
officeManager.start();
logger.info("openoffice服务已链接");
documentConverter=newOfficeDocumentConverter(officeManager);
documentConverter.convert(newFile(inputfilename),newFile(outputfilename));
}
}
转换处理方法
packagecom.document.servers.impl;
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.StringWriter;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importjavax.servlet.http.HttpServletRequest;
importorg.apache.pdfbox.pdmodel.PDDocument;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importcom.document.defined.model.ImagePPT;
importcom.document.servers.OfficeService;
importcom.document.servers.PPTConvertServers;
importcom.document.tool.ImageMagickUtils;
importcom.document.tool.SystemConfig;
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.ppt.util.Command;
@Service("pPTConvertServers")
publicclassPPTConvertServersImplimplementsPPTConvertServers{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(PPTConvertServersImpl.class);
@Autowired
privateOfficeServiceofficeService;
/**
*(non-Javadoc)
*利用openoffice把ppt转图片
*/
publicMapdeal_ppt(HttpServletRequestrequest,StringfilePath,Stringextension,Stringtitle,Stringfilename)
throwsException{
logger.info("ppt转pdf,{}");
//ppt文件地址
Stringppt_target_file=filePath;
//pdf文件地址
Stringpath=filePath.substring(0,filePath.lastIndexOf("."));
Stringpdf_target_file=path+".pdf";
//输出jpg文件地址
Stringimages_target_file=path+"/jpg"+"-%d.jpg";
//if(exists(pdf_target_file)){
//unlink(pdf_target_file);//删除
//}
//copy(newFile(ppt_target_file),ppt_target_file,true);
if(!extension.equals(".pdf")){
officeService.manualConvert(ppt_target_file,pdf_target_file);//转成pdf文件
}
StringWriterwriter=newStringWriter();
//提取文字大纲
String[]pdf_lines=extractOutLineFromPDF(pdf_target_file);
Filefilepath=newFile(images_target_file);
FileparentFile=filepath.getParentFile();
if(!parentFile.exists()){
logger.info("创建图片目录");
parentFile.mkdirs();
}
Command.run("convert"+pdf_target_file+""+images_target_file,writer);//转成图片
StringbasePath=request.getScheme()+"://"+request.getServerName()+"/";
PDDocumentdocument=PDDocument.load(newFile(pdf_target_file));
intpageCount=document.getNumberOfPages();
document.close();
Listlist=newArrayList();
StringpathUrl=filename.substring(0,filename.lastIndexOf("."));
if(pageCount>0){
for(inti=0;i0){
try{
imagePPT.setTitle(pdf_lines[i]);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
imagePPT.setTitle(title);
logger.info("title,数组越界");
//e.printStackTrace();
}
}else{
imagePPT.setTitle(title);
}
imagePPT.setUrl(basePath+"images/"+pathUrl+"/jpg-"+i+".jpg");
imagePPT.setPreviewUrl(basePath+"preview/images/"+pathUrl+"/preview/pjpg-"+i+".jpg");
//StringoimgDir=SystemConfig.getBlobDirectory()+pathUrl+"/jpg-"+i+".jpg";
//StringpimgDir=SystemConfig.getBlobDirectory()+pathUrl+"/preview/pjpg-"+i+".jpg";
//Filepfilepath=newFile(pimgDir);
//Filepf=pfilepath.getParentFile();
//if(!pf.exists()){
//pf.mkdirs();
//}
//ImageMagickUtils.scale(oimgDir,pimgDir,240,180);//预览图
list.add(imagePPT);
}
}
//拼接json字符串
ObjectMapperobjectMapper=newObjectMapper();
Stringjsonlist=objectMapper.writeValueAsString(list);
//logger.info(jsonlist);
Mapmap=newHashMap();
map.put("json",jsonlist.toString());
map.put("totalPage",pageCount);
returnmap;
}
/**
*文件已经上传过,进行替换性转换
*/
publicMapreplace_ppt(HttpServletRequestrequest,StringfilePath,Stringextension,Stringtitle,
Stringfilename)throwsException{
logger.info("替换,ppt转pdf,{}");
//ppt文件地址
Stringppt_target_file=filePath;
//pdf文件地址
Stringpath=filePath.substring(0,filePath.lastIndexOf("."));
Stringpdf_target_file=path+".pdf";
//输出jpg文件地址
Stringimages_target_file=path+"/jpg"+"-%d.jpg";
if(!extension.equals(".pdf")){
officeService.manualConvert(ppt_target_file,pdf_target_file);//转成pdf文件
}
StringWriterwriter=newStringWriter();
//提取文字大纲
String[]pdf_lines=extractOutLineFromPDF(pdf_target_file);
Filefilepath=newFile(images_target_file);
FileparentFile=filepath.getParentFile();
if(!parentFile.exists()){
logger.info("替换创建图片目录");
parentFile.mkdirs();
}
Command.run("convert"+pdf_target_file+""+images_target_file,writer);//转成图片
StringbasePath=request.getScheme()+"://"+request.getServerName()+"/";
PDDocumentdocument=PDDocument.load(newFile(pdf_target_file));
intpageCount=document.getNumberOfPages();
document.close();
Listlist=newArrayList();
StringpathUrl=filename.substring(0,filename.lastIndexOf("."));
if(pageCount>0){
for(inti=0;i0){
try{
imagePPT.setTitle(pdf_lines[i]);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
imagePPT.setTitle(title);
logger.info("title,数组越界");
//e.printStackTrace();
}
}else{
imagePPT.setTitle(title);
}
imagePPT.setUrl(basePath+"images/"+pathUrl+"/jpg-"+i+".jpg");
imagePPT.setPreviewUrl(basePath+"preview/images/"+pathUrl+"/preview/pjpg-"+i+".jpg");
//StringoimgDir=SystemConfig.getBlobDirectory()+pathUrl+"/jpg-"+i+".jpg";
//StringpimgDir=SystemConfig.getBlobDirectory()+pathUrl+"/preview/pjpg-"+i+".jpg";
//Filepfilepath=newFile(pimgDir);
//Filepf=pfilepath.getParentFile();
//if(!pf.exists()){
//pf.mkdirs();
//}
//ImageMagickUtils.scale(oimgDir,pimgDir,240,180);
list.add(imagePPT);
}
}
//拼接json字符串
ObjectMapperobjectMapper=newObjectMapper();
Stringjsonlist=objectMapper.writeValueAsString(list);
//logger.info(jsonlist);
Mapmap=newHashMap();
map.put("json",jsonlist.toString());
map.put("totalPage",pageCount);
returnmap;
}
/**
*提取pdf文字大纲
*@parampdf_file
*@return
*@throwsUnsupportedEncodingException
*@throwsException
*/
publicstaticString[]extractOutLineFromPDF(Stringpdf_file)throwsUnsupportedEncodingException{
Stringsvndir=PPTConvertServersImpl.class.getResource("").getPath();
svndir=svndir.split("WEB-INF")[0];
svndir=svndir.replaceFirst("file:","");
logger.info(svndir);
Stringcommand="/usr/bin/perl"+svndir+"WEB-INF/sh/pdf_outline.pl"+pdf_file;
logger.info(command);
ByteArrayOutputStreamwriter=newByteArrayOutputStream();
Command.run2(command,writer);
Stringoutline=writer.toString("utf-8");
logger.info("titlepdf,{}",outline);
String[]items=outline.split("///");
returnitems;
}
/**
*文件是否存在
*
*@paramfilename
*@return@throwsIOException
*/
publicstaticbooleanexists(Stringfilename){
try{
Filefile=newFile(filename);
returnfile.exists();
}catch(Exceptione){
returnfalse;
}
}
/**
*删除文件
*
*@paramfilename
*@return
*/
publicstaticbooleanunlink(Stringfilename){
try{
Filefile=newFile(filename);
if(file.isFile()){
file.delete();
returntrue;
}
returnfalse;
}catch(Exceptione){
returnfalse;
}
}
/**
*拷贝文件
*
*@paramfile
*@paramnewname
*@paramoverwrite
*@return
*/
publicstaticbooleancopy(Filefile,Stringnewname,booleanoverwrite){
try{
if(!overwrite&&newFile(newname).exists()){
returnfalse;
}
FileInputStreaminput=newFileInputStream(file);
Filedest=newFile(newname);
if(!mkdir(dest.getParent())){
returnfalse;
}
FileOutputStreamoutput=newFileOutputStream(newname);
byte[]b=newbyte[1024*5];
intlen;
while((len=input.read(b))!=-1){
output.write(b,0,len);
}
output.flush();
output.close();
input.close();
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
/**
*创建目录
*
*@paramdirname
*@return
*/
publicstaticbooleanmkdir(Stringdir){
try{
Filefile=newFile(dir);
if(!file.exists()){
file.mkdirs();
}
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
}
上传ppt文件处理类:
packagecom.document.handle.controller;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.io.UnsupportedEncodingException;
importjava.util.Date;
importjava.util.Enumeration;
importjava.util.HashMap;
importjava.util.Map;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.codec.digest.DigestUtils;
importorg.apache.commons.lang3.StringUtils;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RequestParam;
importorg.springframework.web.bind.annotation.ResponseBody;
importorg.springframework.web.multipart.MultipartFile;
importorg.springframework.web.servlet.ModelAndView;
importcom.document.servers.PPTConvertServers;
importcom.document.tool.FilenameUtils;
importcom.document.tool.SystemConfig;
importcom.fasterxml.jackson.annotation.PropertyAccessor;
importcom.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.fasterxml.jackson.databind.ObjectWriter;
@Controller
publicclassPptToImageController{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(PptToImageController.class);
privatestaticfinalStringTYPE_BLOB="BLOB";
privatestaticfinalStringCALLBACK="callback";//回调函数的参数名
@Autowired
privatePPTConvertServerspPTConvertServers;
@RequestMapping(value="/convert/upload")
publicModelAndViewupdateFile(HttpServletRequestrequest,HttpServletResponseresponse){
ModelAndViewmav=newModelAndView();
mav.addObject("name","HelloWord");
mav.setViewName("/ppt/uploadFile");
logger.info("/convert/upload");
returnmav;
}
/**
*显示上传文件的页面表单。
*/
@SuppressWarnings("unchecked")
privateModelAndViewshowUploadForm(HttpServletRequestrequest,Stringtype){
//所有请求参数
Mapparams=newHashMap();
EnumerationparamNames=request.getParameterNames();
while(paramNames.hasMoreElements()){
Stringname=paramNames.nextElement();
Stringvalue=request.getParameter(name);
if(null!=value){
params.put(name,value);
}
}
ModelAndViewmav=newModelAndView();
mav.setViewName("/upload/"+type.toLowerCase());
mav.addObject("parameters",params);
returnmav;
}
/**
*保存用户上传的文件。
*@throwsUnsupportedEncodingException
*/
privateMapsaveUploadedFile(HttpServletRequestrequest,MultipartFilefile,Stringtype){
//文件内容MD5串,避免文件重复上传
Stringmd5=null;
try{
md5=DigestUtils.md5Hex(file.getBytes());
logger.info("文件内容MD5串,{}",md5);
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
StringoriginalFilename=file.getOriginalFilename();
Stringextension=FilenameUtils.getExtension(originalFilename);//文件扩展名
Stringfilename=null;
if(md5!=null){
filename=FilenameUtils.generateFileNameMd5(extension,md5);
}else{
filename=FilenameUtils.generateFileName(extension);
}
StringfilenameUrl=null;//文件访问的URL
StringabsoluteFilename=null;//文件存储的绝对路径
filenameUrl=SystemConfig.getBlobUrl()+filename;
absoluteFilename=SystemConfig.getBlobDirectory()+filename;
//检查是否需要创建目录
Filefilepath=newFile(absoluteFilename);
FileparentFile=filepath.getParentFile();
if(!parentFile.exists()){
parentFile.mkdirs();
}
Mapparams=newHashMap();
//所有请求参数
EnumerationparamNames=request.getParameterNames();
while(paramNames.hasMoreElements()){
Stringname=paramNames.nextElement();
Stringvalue=request.getParameter(name);
if(null!=value){
params.put(name,value);
}
}
Stringpdftitle=originalFilename.substring(0,originalFilename.lastIndexOf("."));
params.put("title",pdftitle);
MapofficeMap=newHashMap();
if(filepath.exists()){
//文件已上传过,文件进行替换
try{
officeMap=pPTConvertServers.replace_ppt(request,absoluteFilename,extension,pdftitle,filename);
params.put("totalPage",officeMap.get("totalPage"));
params.put("data",officeMap.get("json"));
params.put("status","success");
}catch(Exceptione){
//TODOAuto-generatedcatchblock
logger.info("把ppt文件转pdf失败,{}",e);
params.put("status","fail");
params.put("data","把ppt文件转pdf失败");
params.put("totalPage",0);
e.printStackTrace();
}
returnparams;
}
//保存文件
BufferedOutputStreambos=null;
try{
byte[]fileBytes=file.getBytes();
bos=newBufferedOutputStream(newFileOutputStream(filepath));
bos.write(fileBytes);
}catch(IOExceptione){
logger.error("保存'"+originalFilename+"'时发生异常,Cause:",e);
}finally{
if(null!=bos){
try{
bos.close();
}catch(IOExceptione){
}
}
}
//params.put("url",filenameUrl);
//params.put("originalFilename",originalFilename);
//params.put("filesize",file.getSize());
//把ppt文件转pdf,pdf转图片
try{
officeMap=pPTConvertServers.deal_ppt(request,absoluteFilename,extension,pdftitle,filename);
params.put("totalPage",officeMap.get("totalPage"));
params.put("data",officeMap.get("json"));
params.put("status","success");
}catch(Exceptione){
//TODOAuto-generatedcatchblock
logger.info("把ppt文件转pdf失败,{}",e);
params.put("status","fail");
params.put("data","把ppt文件转pdf失败");
params.put("totalPage",0);
e.printStackTrace();
}
returnparams;
}
/**
*处理文件上传。
*@throwsIOException
*
*/
@RequestMapping(value="/convert/upload",method=RequestMethod.POST,produces="text/html;charset=UTF-8")
public@ResponseBodyStringuploadFilePost(HttpServletRequestrequest,
@RequestParam("file")MultipartFilefile)throwsIOException{
Stringcallback=request.getParameter(CALLBACK);//回调函数的函数名
Stringjson="请上传文件";
Mapparams=newHashMap();
ObjectMappermapper=newObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD,Visibility.ANY);
ObjectWriterwriter=mapper.writerWithType(Map.class);
if(!file.isEmpty()){
params=saveUploadedFile(request,file,TYPE_BLOB);
if(params==null){
params=newHashMap();
json="文件已上传过";
params.put("status","fail");
params.put("data",json);
json=writer.writeValueAsString(params);
returnjson.toString();
}
try{
json=writer.writeValueAsString(params);
//json=(String)params.get("data");
}catch(Exceptione){
logger.error("转换Blob上传参数为JSON时发生异常,Cause:",e);
}
if(StringUtils.isBlank(callback)){
returnjson.toString();
}else{
returncallback+"("+json.toString()+");";
}
}
//还没上传文件的
params.put("status","fail");
params.put("data",json);
json=writer.writeValueAsString(params);
returnjson.toString();
}
}
预览图代理输出-----处理类:
packagecom.document.handle.controller;
importjava.io.File;
importjava.io.IOException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestMapping;
importcom.document.tool.ImageMagickUtils;
importcom.document.tool.SystemConfig;
@Controller
publicclassImageAgentController{
privatestaticfinalLoggerLOG=LoggerFactory.getLogger(ImageAgentController.class);
/**
*ppt预览图片代理输出
*@throwsIOException
*/
@RequestMapping("/preview/images/{year}/{month}/{md5id}/{preview}/{filename}.{ext}")
publicvoidcropImage(@PathVariableStringyear,@PathVariableStringmonth,@PathVariableStringmd5id,@PathVariableStringpreview,@PathVariableStringfilename,@PathVariableStringext,HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{
//StringrootDir="/data05/ovp/images/";
StringrootDir=SystemConfig.getBlobDirectory();
Stringoname=filename.substring(1,filename.length());//原图文件名
StringdirString=rootDir+year+"/"+month+"/"+md5id+"/"+oname+"."+ext;
StringtargetFileString=rootDir+year+"/"+month+"/"+md5id+"/preview/"+filename+"."+ext;
LOG.info("corpImage..."+dirString+"->"+targetFileString);
Filenewfile=newFile(targetFileString);
StringpathString=newfile.getParent();
LOG.info("pathString...{}{}",pathString);
FilepathFile=newFile(pathString);
if(!pathFile.exists()){
LOG.info("---createfile---");
pathFile.mkdirs();
}
booleanstatus=ImageMagickUtils.scale(dirString,targetFileString,240,180);
if(status){
response.reset();
response.setContentType("image/"+ext);
java.io.InputStreamin=newjava.io.FileInputStream(targetFileString);
//FilenameUrlUtils.getImageFilename(targetFileString);
if(in!=null)
{
byte[]b=newbyte[1024];
intlen;
while((len=in.read(b))!=-1)
{
response.getOutputStream().write(b);
}
in.close();
}
}
}
}
提取文字大纲的perl脚本:
usestrict;
usewarnings;
useutf8;
useopen':encoding(utf8)';
binmode(STDOUT,":utf8");
subtrim($)
{
my$string=shift;
$string=~s/^\s+//;
$string=~s/\s+$//;
return$string;
}
if(!$ARGV[0]){
die;
}
openmy$fh,"pdftotext-layout-encUTF-8$ARGV[0]-|"ordie$!;
my$firstline=<$fh>;
printtrim($firstline);
my$pageNum=1;
while(my$line=<$fh>){
if($line=~/\xC/){
my$count=($line=~tr/\xC//);
for(my$i=0;$i<$count-1;$i++){
print"///".$pageNum;
$pageNum++;
}
if(trim($line)){
print"///".trim($line);
}
$pageNum++;
}
}
close$fh;
可能遇到的问题:
1、ppt转pdf时,遇到启动失败(不清楚是不是再次启动引起的)
2、转换后的pdf表格里的中文会出现乱码
3、有时会出现关闭服务器的所用服务(尚不清楚什么原因引起的)
4、处理请求时,经常出现超时504
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。