java调用openoffice将office系列文档转换为PDF的示例方法
前导:
发过程中经常会使用java将office系列文档转换为PDF,一般都使用微软提供的openoffice+jodconverter实现转换文档。
openoffice既有windows版本也有linux版。不用担心生产环境是linux系统。
1、openoffice依赖jar,以maven为例:
com.artofsolving jodconverter 2.2.1 org.openoffice jurt 3.0.1 org.openoffice ridl 3.0.1 org.openoffice juh 3.0.1 org.openoffice unoil 3.0.1 org.slf4j slf4j-jdk14 1.4.3
2、直接上转换代码,需要监听openoffice应用程序8100端口即可。
publicvoidconvert(FilesourceFile,FiletargetFile){ try{ //1:打开连接 OpenOfficeConnectionconnection=newSocketOpenOfficeConnection(8100); connection.connect(); DocumentConverterconverter=newOpenOfficeDocumentConverter(connection); //2:获取Format DocumentFormatRegistryfactory=newBasicDocumentFormatRegistry(); DocumentFormatinputDocumentFormat=factory .getFormatByFileExtension(getExtensionName(sourceFile.getAbsolutePath())); DocumentFormatoutputDocumentFormat=factory .getFormatByFileExtension(getExtensionName(targetFile.getAbsolutePath())); //3:执行转换 converter.convert(sourceFile,inputDocumentFormat,targetFile,outputDocumentFormat); }catch(ConnectExceptione){ log.info("文档转换PDF失败"); } }
3、需注意:jodconverter在转换2007版本以后的xxx.docx文档会报错,原因大家都明03后缀名xxx.doc 07以后版本xxx.docx
查看jodconverter源码发现documentFormat不支持xxx.docx格式BasicDocumentFormatRegistry中publicDocumentFormatgetFormatByFileExtension(Stringextension)默认支持是使用doc格式
BasicDocumentFormatRegistry类源码
// //JODConverter-JavaOpenDocumentConverter //Copyright(C)2004-2007-MirkoNasato// //Thislibraryisfreesoftware;youcanredistributeitand/or //modifyitunderthetermsoftheGNULesserGeneralPublic //LicenseaspublishedbytheFreeSoftwareFoundation;either //version2.1oftheLicense,or(atyouroption)anylaterversion. // //Thislibraryisdistributedinthehopethatitwillbeuseful, //butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof //MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNU //LesserGeneralPublicLicenseformoredetails. //http://www.gnu.org/copyleft/lesser.html // packagecom.artofsolving.jodconverter; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; publicclassBasicDocumentFormatRegistryimplementsDocumentFormatRegistry{ privateList/* */documentFormats=newArrayList(); publicvoidaddDocumentFormat(DocumentFormatdocumentFormat){ documentFormats.add(documentFormat); } protectedList/* */getDocumentFormats(){ returndocumentFormats; } /** *@paramextensionthefileextension *@returntheDocumentFormatforthisextension,ornulliftheextensionisnotmapped */ publicDocumentFormatgetFormatByFileExtension(Stringextension){ if(extension==null){ returnnull; } StringlowerExtension=extension.toLowerCase(); for(Iteratorit=documentFormats.iterator();it.hasNext();){ DocumentFormatformat=(DocumentFormat)it.next(); if(format.getFileExtension().equals(lowerExtension)){ returnformat; } } returnnull; } publicDocumentFormatgetFormatByMimeType(StringmimeType){ for(Iteratorit=documentFormats.iterator();it.hasNext();){ DocumentFormatformat=(DocumentFormat)it.next(); if(format.getMimeType().equals(mimeType)){ returnformat; } } returnnull; } }
BasicDocumentFormatRegistry的默认实现类DefaultDocumentFormatRegistry 中支持的文件格式如下
// //JODConverter-JavaOpenDocumentConverter //Copyright(C)2004-2007-MirkoNasato// //Thislibraryisfreesoftware;youcanredistributeitand/or //modifyitunderthetermsoftheGNULesserGeneralPublic //LicenseaspublishedbytheFreeSoftwareFoundation;either //version2.1oftheLicense,or(atyouroption)anylaterversion. // //Thislibraryisdistributedinthehopethatitwillbeuseful, //butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof //MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNU //LesserGeneralPublicLicenseformoredetails. //http://www.gnu.org/copyleft/lesser.html // packagecom.artofsolving.jodconverter; publicclassDefaultDocumentFormatRegistryextendsBasicDocumentFormatRegistry{ publicDefaultDocumentFormatRegistry(){ finalDocumentFormatpdf=newDocumentFormat("PortableDocumentFormat","application/pdf","pdf"); pdf.setExportFilter(DocumentFamily.DRAWING,"draw_pdf_Export"); pdf.setExportFilter(DocumentFamily.PRESENTATION,"impress_pdf_Export"); pdf.setExportFilter(DocumentFamily.SPREADSHEET,"calc_pdf_Export"); pdf.setExportFilter(DocumentFamily.TEXT,"writer_pdf_Export"); addDocumentFormat(pdf); finalDocumentFormatswf=newDocumentFormat("MacromediaFlash","application/x-shockwave-flash","swf"); swf.setExportFilter(DocumentFamily.DRAWING,"draw_flash_Export"); swf.setExportFilter(DocumentFamily.PRESENTATION,"impress_flash_Export"); addDocumentFormat(swf); finalDocumentFormatxhtml=newDocumentFormat("XHTML","application/xhtml+xml","xhtml"); xhtml.setExportFilter(DocumentFamily.PRESENTATION,"XHTMLImpressFile"); xhtml.setExportFilter(DocumentFamily.SPREADSHEET,"XHTMLCalcFile"); xhtml.setExportFilter(DocumentFamily.TEXT,"XHTMLWriterFile"); addDocumentFormat(xhtml); //HTMListreatedasTextwhensuppliedasinput,butasanoutputitisalso //availableforexportingSpreadsheetandPresentationformats finalDocumentFormathtml=newDocumentFormat("HTML",DocumentFamily.TEXT,"text/html","html"); html.setExportFilter(DocumentFamily.PRESENTATION,"impress_html_Export"); html.setExportFilter(DocumentFamily.SPREADSHEET,"HTML(StarCalc)"); html.setExportFilter(DocumentFamily.TEXT,"HTML(StarWriter)"); addDocumentFormat(html); finalDocumentFormatodt=newDocumentFormat("OpenDocumentText",DocumentFamily.TEXT,"application/vnd.oasis.opendocument.text","odt"); odt.setExportFilter(DocumentFamily.TEXT,"writer8"); addDocumentFormat(odt); finalDocumentFormatsxw=newDocumentFormat("OpenOffice.org1.0TextDocument",DocumentFamily.TEXT,"application/vnd.sun.xml.writer","sxw"); sxw.setExportFilter(DocumentFamily.TEXT,"StarOfficeXML(Writer)"); addDocumentFormat(sxw); finalDocumentFormatdoc=newDocumentFormat("MicrosoftWord",DocumentFamily.TEXT,"application/msword","doc"); doc.setExportFilter(DocumentFamily.TEXT,"MSWord97"); addDocumentFormat(doc); finalDocumentFormatrtf=newDocumentFormat("RichTextFormat",DocumentFamily.TEXT,"text/rtf","rtf"); rtf.setExportFilter(DocumentFamily.TEXT,"RichTextFormat"); addDocumentFormat(rtf); finalDocumentFormatwpd=newDocumentFormat("WordPerfect",DocumentFamily.TEXT,"application/wordperfect","wpd"); addDocumentFormat(wpd); finalDocumentFormattxt=newDocumentFormat("PlainText",DocumentFamily.TEXT,"text/plain","txt"); //setFilterNameto"Text"topreventOOofromtryigntodisplaythe"ASCIIFilterOptions"dialog //alternativelyFilterNamecouldbe"Text(encoded)"andFilterOptionsusedtosetencodingifneeded txt.setImportOption("FilterName","Text"); txt.setExportFilter(DocumentFamily.TEXT,"Text"); addDocumentFormat(txt); finalDocumentFormatwikitext=newDocumentFormat("MediaWikiwikitext","text/x-wiki","wiki"); wikitext.setExportFilter(DocumentFamily.TEXT,"MediaWiki"); addDocumentFormat(wikitext); finalDocumentFormatods=newDocumentFormat("OpenDocumentSpreadsheet",DocumentFamily.SPREADSHEET,"application/vnd.oasis.opendocument.spreadsheet","ods"); ods.setExportFilter(DocumentFamily.SPREADSHEET,"calc8"); addDocumentFormat(ods); finalDocumentFormatsxc=newDocumentFormat("OpenOffice.org1.0Spreadsheet",DocumentFamily.SPREADSHEET,"application/vnd.sun.xml.calc","sxc"); sxc.setExportFilter(DocumentFamily.SPREADSHEET,"StarOfficeXML(Calc)"); addDocumentFormat(sxc); finalDocumentFormatxls=newDocumentFormat("MicrosoftExcel",DocumentFamily.SPREADSHEET,"application/vnd.ms-excel","xls"); xls.setExportFilter(DocumentFamily.SPREADSHEET,"MSExcel97"); addDocumentFormat(xls); finalDocumentFormatcsv=newDocumentFormat("CSV",DocumentFamily.SPREADSHEET,"text/csv","csv"); csv.setImportOption("FilterName","Text-txt-csv(StarCalc)"); csv.setImportOption("FilterOptions","44,34,0");//FieldSeparator:',';TextDelimiter:'"' csv.setExportFilter(DocumentFamily.SPREADSHEET,"Text-txt-csv(StarCalc)"); csv.setExportOption(DocumentFamily.SPREADSHEET,"FilterOptions","44,34,0"); addDocumentFormat(csv); finalDocumentFormattsv=newDocumentFormat("Tab-separatedValues",DocumentFamily.SPREADSHEET,"text/tab-separated-values","tsv"); tsv.setImportOption("FilterName","Text-txt-csv(StarCalc)"); tsv.setImportOption("FilterOptions","9,34,0");//FieldSeparator:'\t';TextDelimiter:'"' tsv.setExportFilter(DocumentFamily.SPREADSHEET,"Text-txt-csv(StarCalc)"); tsv.setExportOption(DocumentFamily.SPREADSHEET,"FilterOptions","9,34,0"); addDocumentFormat(tsv); finalDocumentFormatodp=newDocumentFormat("OpenDocumentPresentation",DocumentFamily.PRESENTATION,"application/vnd.oasis.opendocument.presentation","odp"); odp.setExportFilter(DocumentFamily.PRESENTATION,"impress8"); addDocumentFormat(odp); finalDocumentFormatsxi=newDocumentFormat("OpenOffice.org1.0Presentation",DocumentFamily.PRESENTATION,"application/vnd.sun.xml.impress","sxi"); sxi.setExportFilter(DocumentFamily.PRESENTATION,"StarOfficeXML(Impress)"); addDocumentFormat(sxi); finalDocumentFormatppt=newDocumentFormat("MicrosoftPowerPoint",DocumentFamily.PRESENTATION,"application/vnd.ms-powerpoint","ppt"); ppt.setExportFilter(DocumentFamily.PRESENTATION,"MSPowerPoint97"); addDocumentFormat(ppt); finalDocumentFormatodg=newDocumentFormat("OpenDocumentDrawing",DocumentFamily.DRAWING,"application/vnd.oasis.opendocument.graphics","odg"); odg.setExportFilter(DocumentFamily.DRAWING,"draw8"); addDocumentFormat(odg); finalDocumentFormatsvg=newDocumentFormat("ScalableVectorGraphics","image/svg+xml","svg"); svg.setExportFilter(DocumentFamily.DRAWING,"draw_svg_Export"); addDocumentFormat(svg); } }
解决方法:重写BasicDocumentFormatRegistry类中publicDocumentFormatgetFormatByFileExtension(Stringextension)方法,只要是后缀名包含doc则使用doc的documentFormat文档格式
// //JODConverter-JavaOpenDocumentConverter //Copyright(C)2004-2007-MirkoNasato// //Thislibraryisfreesoftware;youcanredistributeitand/or //modifyitunderthetermsoftheGNULesserGeneralPublic //LicenseaspublishedbytheFreeSoftwareFoundation;either //version2.1oftheLicense,or(atyouroption)anylaterversion. // //Thislibraryisdistributedinthehopethatitwillbeuseful, //butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof //MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNU //LesserGeneralPublicLicenseformoredetails. //http://www.gnu.org/copyleft/lesser.html // packagecom.artofsolving.jodconverter; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; /** *重写BasicDocumentFormatRegistry文档格式 *@authorHuGuangJun */ publicclassBasicDocumentFormatRegistryimplementsDocumentFormatRegistry{ privateList/* */documentFormats=newArrayList(); publicvoidaddDocumentFormat(DocumentFormatdocumentFormat){ documentFormats.add(documentFormat); } protectedList/* */getDocumentFormats(){ returndocumentFormats; } /** *@paramextension *thefileextension *@returntheDocumentFormatforthisextension,ornulliftheextension *isnotmapped */ publicDocumentFormatgetFormatByFileExtension(Stringextension){ if(extension==null){ returnnull; } //将文件名后缀统一转化 if(extension.indexOf("doc")>=0){ extension="doc"; } if(extension.indexOf("ppt")>=0){ extension="ppt"; } if(extension.indexOf("xls")>=0){ extension="xls"; } StringlowerExtension=extension.toLowerCase(); for(Iteratorit=documentFormats.iterator();it.hasNext();){ DocumentFormatformat=(DocumentFormat)it.next(); if(format.getFileExtension().equals(lowerExtension)){ returnformat; } } returnnull; } publicDocumentFormatgetFormatByMimeType(StringmimeType){ for(Iteratorit=documentFormats.iterator();it.hasNext();){ DocumentFormatformat=(DocumentFormat)it.next(); if(format.getMimeType().equals(mimeType)){ returnformat; } } returnnull; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。