JAVA中如何使用openoffice将Excel转PDF再转图片功能(excel,java,openoffice,开发技术)

时间:2024-05-06 11:41:41 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

需求

公司一个小项目要结尾了, 有非常多的表格, 而且非常复杂, 例如

JAVA中如何使用openoffice将Excel转PDF再转图片功能

例如:(这表格, 有想死的心…)

JAVA中如何使用openoffice将Excel转PDF再转图片功能

看到这样的表格,第一反应是n脸懵逼,这得做到啥时候啊,最后想到用一个方法,让客户自己玩!!
平台提供Excel模版下载,客户下载填写完再提交Excel,平台再将Excel转PDF,顺便将PDF转成图片,给前端展示,想法简单,方案可行,开工!

方案:

  • windows server下用 jacob, windows上可完美运行, 但是!!!Linux上不支持jacob!!!(非常重要!!)

  • poi + iText,貌似不错

  • openoffice,跨平台

本文选用openoffice,各位看官可自选用iText + poi,自己判别!当然也可以用jacob,前提是你不需要在Linux中运行项目。

安装软件:下载传送门

win:

JAVA中如何使用openoffice将Excel转PDF再转图片功能

下载完成后,一路next,最好默认路径安装,免得折腾
完成后 Win + R 填入 Dcomcnfg 打开组件服务

JAVA中如何使用openoffice将Excel转PDF再转图片功能

设置openoffice组件服务, 都设成SYSTEM

JAVA中如何使用openoffice将Excel转PDF再转图片功能

再设置标识为:交互式用户

JAVA中如何使用openoffice将Excel转PDF再转图片功能

进入到安装目录,如果路径是默认的,则在 C:\Program Files (x86)\OpenOffice 4\program 下面,
进到这个路径下,按住 shift 再点击鼠标右键,在此处打开命令窗口,输入 soffice -headless-accept=“socket,host=127.0.0.1,port=8100;urp;”-nofirststartwizard, 查看是否启动成功, 黑窗口输入 netstat -ano

JAVA中如何使用openoffice将Excel转PDF再转图片功能
JAVA中如何使用openoffice将Excel转PDF再转图片功能

windows下安装完毕!

参考: https://blog.csdn.net/qq_30987095/article/details/78789103

linux:下载传送门

JAVA中如何使用openoffice将Excel转PDF再转图片功能

根据自己的Linux系统选择RPM包或者DEB,如果是Ubuntu则选DEB,其他就选RPM包,查看当前操作系统是ubuntu还是centos

[root@iZ2zeg3etf08f6snef3lgrZ~]#lsb_release-aLSBVersion: :(略)DistributorID: CentOSDescription: CentOSLinuxrelease(略)Release: (略)Codename: Core

下载完毕后,利用ssh工具上传到服务器上!

>tar-zxvfApache_OpenOffice_4.1.3_Linux_x86-64_install-rpm_zh-CN.tar.gz(略)......>lszh-CN>cdzh-CN/RPMS>lsopenoffice-core01-4.1.3-9783.x86_64.rpmopenoffice-impress-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-4.1.3-9783.x86_64.rpmopenoffice-4.1.3-9783.x86_64.rpmopenoffice-core02-4.1.3-9783.x86_64.rpmopenoffice-javafilter-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-base-4.1.3-9783.x86_64.rpmopenoffice-base-4.1.3-9783.x86_64.rpmopenoffice-core03-4.1.3-9783.x86_64.rpmopenoffice-math-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-calc-4.1.3-9783.x86_64.rpmopenoffice-brand-base-4.1.3-9783.x86_64.rpmopenoffice-core04-4.1.3-9783.x86_64.rpmopenoffice-ogltrans-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-draw-4.1.3-9783.x86_64.rpmopenoffice-brand-calc-4.1.3-9783.x86_64.rpmopenoffice-core05-4.1.3-9783.x86_64.rpmopenoffice-onlineupdate-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-help-4.1.3-9783.x86_64.rpmopenoffice-brand-draw-4.1.3-9783.x86_64.rpmopenoffice-core06-4.1.3-9783.x86_64.rpmopenoffice-ooofonts-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-impress-4.1.3-9783.x86_64.rpmopenoffice-brand-impress-4.1.3-9783.x86_64.rpmopenoffice-core07-4.1.3-9783.x86_64.rpmopenoffice-ooolinguistic-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-math-4.1.3-9783.x86_64.rpmopenoffice-brand-math-4.1.3-9783.x86_64.rpmopenoffice-draw-4.1.3-9783.x86_64.rpmopenoffice-pyuno-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-res-4.1.3-9783.x86_64.rpmopenoffice-brand-writer-4.1.3-9783.x86_64.rpmopenoffice-gnome-integration-4.1.3-9783.x86_64.rpmopenoffice-ure-4.1.3-9783.x86_64.rpmopenoffice-zh-CN-writer-4.1.3-9783.x86_64.rpmopenoffice-brand-zh-CN-4.1.3-9783.x86_64.rpmopenoffice-graphicfilter-4.1.3-9783.x86_64.rpmopenoffice-writer-4.1.3-9783.x86_64.rpmopenoffice-calc-4.1.3-9783.x86_64.rpmopenoffice-images-4.1.3-9783.x86_64.rpmopenoffice-xsltfilter-4.1.3-9783.x86_64.rpm[注释:运行下面命令,生成desktop-integration包]>yumlocalinstall*.rpm>(略...)>cddesktop-integration/>ls>openoffice4.1.3-freedesktop-menus-4.1.3-9783.noarch.rpmopenoffice4.1.3-mandriva-menus-4.1.3-9783.noarch.rpmopenoffice4.1.3-redhat-menus-4.1.3-9783.noarch.rpmopenoffice4.1.3-suse-menus-4.1.3-9783.noarch.rpm>yumlocalinstallopenoffice4.1.3-redhat-menus-4.1.3-9783.noarch.rpm

ok, 安装完毕了! 启动服务
进入到默认安装目录下

>cd/opt/openoffice4/program/[注释:临时启动]>/opt/openoffice4/program/soffice-headless-accept="socket,host=127.0.0.1,port=8100;urp;"-nofirststartwizard[注释:或后台启动]>/opt/openoffice4/program/soffice-headless-accept="socket,host=127.0.0.1,port=8100;urp;"-nofirststartwizard&[注释:永久启动]>nohup/opt/openoffice4/program/soffice-headless-accept="socket,host=127.0.0.1,port=8100;urp;"-nofirststartwizard&[注释:查看是否启动成功]>ps-ef|grepopenofficeroot75417527010:19pts/000:00:12/opt/openoffice4/program/soffice.bin-headless-accept=socket,host=127.0.0.1,port=8100;urp;-nofirststartwizardroot89647066018:18pts/300:00:00grep--color=autoopenoffice或者>netstat-tunlp|greptcp00127.0.0.1:81000.0.0.0:*LISTEN7541/soffice.bin

Linux下安装成功!

开始撸码:

pom.xml

 <!--openoffice相关依赖--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency><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> <!--pdf2img--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.6</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.6</version></dependency>

OpenOfficeUtils

importjava.awt.*;importjava.io.File;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ConnectException;importorg.apache.commons.lang.StringUtils;importcom.artofsolving.jodconverter.DefaultDocumentFormatRegistry;importcom.artofsolving.jodconverter.DocumentConverter;importcom.artofsolving.jodconverter.DocumentFormatRegistry;importcom.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;importcom.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;importcom.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;importcom.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.pdmodel.PDPage;importorg.apache.pdfbox.pdmodel.PDPageTree;importorg.apache.pdfbox.rendering.ImageType;importorg.apache.pdfbox.rendering.PDFRenderer;importorg.apache.pdfbox.tools.imageio.ImageIOUtil;importjava.awt.image.BufferedImage;importjava.awt.image.RenderedImage;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjavax.imageio.ImageIO;/****@authorjosnow*@date2023年5月9日下午12:38:39*@version1.0.0*@descopenoffice转换工具*/publicclassOpenOfficeUtils{publicstaticfinalStringLOCAL_HOST="localhost";publicstaticfinalintLOCAL_PORT=8100;//FormatpublicstaticDocumentFormatRegistryformatFactory=newDefaultDocumentFormatRegistry();/****@desc*@authjosnow*@date2023年6月9日下午4:11:04*@paraminputFilePath*待转换的文件路径*@paramoutputFilePath*输出文件路径*/publicstaticvoidconvert(StringinputFilePath,StringoutputFilePath)throwsConnectException{convert(inputFilePath,outputFilePath,LOCAL_HOST,LOCAL_PORT);}/****@desc*@authjosnow*@date2023年6月9日下午4:12:29*@paraminputFilePath*待转换的文件路径*@paramoutputFilePath*输出文件路径*@paramconnectIp*远程调用ip*@paramconnectPort*远程调用端口*/publicstaticvoidconvert(StringinputFilePath,StringoutputFilePath,StringconnectIp,intconnectPort)throwsConnectException{if(StringUtils.isEmpty(inputFilePath)||StringUtils.isEmpty(outputFilePath)||StringUtils.isEmpty(connectIp)){thrownewIllegalArgumentException("参数异常!!");}OpenOfficeConnectionconnection=newSocketOpenOfficeConnection(connectIp,connectPort);connection.connect();// TODOExcel转成PDF默认是A4纸//DocumentConverterconverter=getConverter(connectIp,connection);//converter.convert(newFile(inputFilePath),newFile(outputFilePath));// TODOExcel转成PDF默认是A4纸,如果现实折行,则自定义ConverterDocument,改变纸张大小ConverterDocumentconverterDocument=newConverterDocument(connection);converterDocument.convert(newFile(inputFilePath),newFile(outputFilePath));connection.disconnect();}/****@desc*@authjosnow*@date2023年6月9日下午4:08:26*@paraminputStream*@paraminputFileExtension*待转换文件的扩展名,例如:xls,doc*@paramoutputStream*@paramoutputFileExtension*输出文件扩展名,例如:pdf*/publicstaticvoidconvert(InputStreaminputStream,StringinputFileExtension,OutputStreamoutputStream,StringoutputFileExtension)throwsConnectException{convert(inputStream,inputFileExtension,outputStream,outputFileExtension,LOCAL_HOST,LOCAL_PORT);}/****@desc*@authjosnow*@date2023年6月9日下午4:10:21*@paraminputStream*@paraminputFileExtension*待转换文件的扩展名,例如:xls,doc*@paramoutputStream*@paramoutputFileExtension*输出文件扩展名,例如:pdf*@paramconnectIp*远程调用ip*@paramconnectPort*远程调用端口*/publicstaticvoidconvert(InputStreaminputStream,StringinputFileExtension,OutputStreamoutputStream,StringoutputFileExtension,StringconnectIp,intconnectPort)throwsConnectException{if(inputStream==null||StringUtils.isEmpty(inputFileExtension)||outputStream==null||StringUtils.isEmpty(outputFileExtension)||StringUtils.isEmpty(connectIp)){thrownewIllegalArgumentException("参数异常!!");}OpenOfficeConnectionconnection=newSocketOpenOfficeConnection(connectIp,connectPort);connection.connect();DocumentConverterconverter=getConverter(connectIp,connection);converter.convert(inputStream,formatFactory.getFormatByFileExtension(inputFileExtension),outputStream,formatFactory.getFormatByFileExtension(outputFileExtension));connection.disconnect();}privatestaticDocumentConvertergetConverter(StringconnectIp,OpenOfficeConnectionconnection){DocumentConverterconverter="localhost".equals(connectIp)||"127.0.0.1".equals(connectIp)||"0:0:0:0:0:0:0:1".equals(connectIp)?newOpenOfficeDocumentConverter(connection):newStreamOpenOfficeDocumentConverter(connection);returnconverter;}publicstaticvoidmain(String[]args)throwsException{OpenOfficeUtils.convert("D:\\test.xls","D:\\test.pdf");pdf2image(newFile("D:\\test.pdf"));}/***pdftobigimage*github:https://github.com/mmtou/pdf2img*@parampdfFilepdf文件路径*@returnbigimagefile*@throwsException*/publicstaticFilepdf2image(FilepdfFile)throwsException{//拼成图片后的宽度和高度intw=0;inth=0;List<BufferedImage>images=newArrayList();//生成图片后的路径Stringpath=pdfFile.getParent()+File.separator;StringfileName=pdfFile.getName().replace(".pdf","");FiledestinationFile=newFile(path);if(!destinationFile.exists()){destinationFile.mkdir();}PDDocumentdocument=PDDocument.load(pdfFile);PDPageTreelist=document.getDocumentCatalog().getPages();intpageCounter=0;for(PDPagepage:list){PDFRendererpdfRenderer=newPDFRenderer(document);BufferedImageimage=pdfRenderer.renderImageWithDPI(pageCounter,100,ImageType.RGB);Stringtarget=path+fileName+"-"+(pageCounter++)+".png";ImageIOUtil.writeImage(image,target,100);w=image.getWidth();h+=image.getHeight();images.add(image);newFile(target).delete();}document.close();BufferedImagecombined=newBufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);Graphicsg=combined.getGraphics();inty=0;for(BufferedImageimage:images){g.drawImage(image,0,y,null);y+=image.getHeight();}//SaveasnewimageFileimage=newFile(path,fileName+".png");ImageIO.write(combined,"PNG",image);returnimage;}}

自定义 ConverterDocument

importcom.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;importcom.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;importcom.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;importcom.sun.star.awt.Size;importcom.sun.star.beans.PropertyValue;importcom.sun.star.lang.XComponent;importcom.sun.star.uno.UnoRuntime;importcom.sun.star.view.PaperFormat;importcom.sun.star.view.XPrintable;publicclassConverterDocumentextendsStreamOpenOfficeDocumentConverter{publicConverterDocument(OpenOfficeConnectionconnection){super(connection);}publicfinalstaticSizeA5,A4,A3;publicfinalstaticSizeB4,B5,B6;publicfinalstaticSizeKaoqinReport;static{A5=newSize(14800,21000);A4=newSize(21000,29700);A3=newSize(29700,42000);B4=newSize(25000,35300);B5=newSize(17600,25000);B6=newSize(12500,17600);//KaoqinReport=newSize(29700,27940);//最大限度宽1600000KaoqinReport=newSize(25000,21000);;}@OverrideprotectedvoidrefreshDocument(XComponentdocument){super.refreshDocument(document);//ThedefaultpaperformatandorientationisA4andportrait.To//changepaperorientation//resetpagesizeXPrintablexPrintable=(XPrintable)UnoRuntime.queryInterface(XPrintable.class,document);PropertyValue[]printerDesc=newPropertyValue[2];//PaperOrientation//printerDesc[0]=newPropertyValue();//printerDesc[0].Name="PaperOrientation";//printerDesc[0].Value=PaperOrientation.PORTRAIT;//PaperFormatprinterDesc[0]=newPropertyValue();printerDesc[0].Name="PaperFormat";printerDesc[0].Value=PaperFormat.USER;//PaperSizeprinterDesc[1]=newPropertyValue();printerDesc[1].Name="PaperSize";printerDesc[1].Value=KaoqinReport;try{xPrintable.setPrinter(printerDesc);}catch(Exceptione){e.printStackTrace();}}}

使用:

 publicstaticvoidmain(String[]args)throwsException{OpenOfficeUtils.convert("D:\\test.xls","D:\\test.pdf");pdf2image(newFile("D:\\test.pdf")); }
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:JAVA中如何使用openoffice将Excel转PDF再转图片功能的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:MySQL如何实现查询树结构下一篇:

3 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18