利用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(); List list=newArrayList (); StringpathUrl=filename.substring(0,filename.lastIndexOf(".")); if(pageCount>0){ for(inti=0;i 0){ 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); Map map=newHashMap (); map.put("json",jsonlist.toString()); map.put("totalPage",pageCount); returnmap; } /** *文件已经上传过,进行替换性转换 */ publicMap replace_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(); List list=newArrayList (); StringpathUrl=filename.substring(0,filename.lastIndexOf(".")); if(pageCount>0){ for(inti=0;i 0){ 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); Map map=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 (); Enumeration paramNames=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 */ privateMap saveUploadedFile(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(); } Map params=newHashMap (); //所有请求参数 Enumeration paramNames=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); Map officeMap=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="请上传文件"; Map params=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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。