javaopenOffice实现局域网内在线预览(docx转pdf)
前言
当前的主浏览器都支持直接打开pdf文件,从而实现文件预览。如果是其他格式文件则得下载,因此用openOffice实现文件转pdf格式。 一、 openOffice的安装下载地址:http://www.openoffice.org/
安装教程可参考:openOffice下载和安装 进入安装目录,输入cmd 命令窗口输入以下命令启动:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard 二、测试导包 com.artofsolving jodconverter 2.2.1 文件工具类 import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * 文件格式转换工具类 * * @author Simon * @version 1.0 * @since JDK1.8 */ public class FileConvertUtil { /** 默认转换后文件后缀 */ private static final String DEFAULT_SUFFIX = "pdf"; /** openoffice_port */ public static final String DEFAULT_HOST = "127.0.0.1"; private static final Integer OPENOFFICE_PORT = 8100; /** * office文档转换为PDF(处理本地文件) */ public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception { File inputFile = new File(sourcePath); InputStream inputStream = new FileInputStream(inputFile); return covertCommonByStream(inputStream, suffix); } /** * office文档转换为PDF(处理网络文件) */ public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception { // 创建URL URL url = new URL(netFileUrl); // 试图连接并取得返回状态码 URLConnection urlconn = url.openConnection(); urlconn.connect(); HttpURLConnection httpconn = (HttpURLConnection) urlconn; int httpResult = httpconn.getResponseCode(); if (httpResult == HttpURLConnection.HTTP_OK) { InputStream inputStream = urlconn.getInputStream(); return covertCommonByStream(inputStream, suffix); } return null; } /** * 将文件以流的形式转换 */ public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT); connection.connect(); DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection); DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry(); DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX); DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix); converter.convert(inputStream, sourceFormat, out, targetFormat); connection.disconnect(); return outputStreamConvertInputStream(out); } /** * outputStream转inputStream */ public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception { ByteArrayOutputStream baos=(ByteArrayOutputStream) out; return new ByteArrayInputStream(baos.toByteArray()); } } controler层代码 @PostMapping("/onlinePreview") public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response) throws Exception { //获取文件类型 根据实际的url截断 String suffix = url.substring(url.lastIndexOf(".") + 1); if (!suffix.equals("txt") && !suffix.equals("doc") && !suffix.equals("docx") && !suffix.equals("xls") && !suffix.equals("xlsx") && !suffix.equals("ppt") && !suffix.equals("pptx") && !suffix.equals("sheet") && !suffix.equals("pdf")) { throw new Exception("文件格式不支持预览"); } //我的文件是存在本地上的,该url是为了别的电脑能访问到,再传到这的时候就是解析本地文件了,所以找到我的本地文件路径 //根据具体情况来,否则会报错 url=url.replace("192.168.1.125:8765/knowledge/","G:/creo/knowledge/"); //处理本地文件 InputStream in = FileConvertUtil.convertLocaleFile(url, suffix); OutputStream outputStream = response.getOutputStream(); //创建存放文件内容的数组 byte[] buff = new byte[1024]; //所读取的内容使用n来接收 int n; //当没有读取完时,继续读取,循环 while ((n = in.read(buff)) != -1) { //将字节数组的数据全部写入到输出流中 outputStream.write(buff, 0, n); } //强制将缓存区的数据进行输出 outputStream.flush(); //关流 outputStream.close(); in.close(); } 常见异常
java.lang.IllegalArgumentException: inputFormat is null at com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.ensureNotNull(AbstractOpenOfficeDocumentConverter.java:113)
这是因为转换07版本及高版本(.docx/.xlsx/.pptx)时,这三种格式不在所支持的文件格式中。
** 解决办法: **
重写BasicDocumentFormatRegistry (一定得在com.artofsolving.jodconverter包下) package com.artofsolving.jodconverter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class BasicDocumentFormatRegistry implements DocumentFormatRegistry { private List documentFormats = new ArrayList(); public BasicDocumentFormatRegistry() { } public void addDocumentFormat(DocumentFormat documentFormat) { this.documentFormats.add(documentFormat); } protected List getDocumentFormats() { return this.documentFormats; } public DocumentFormat getFormatByFileExtension(String extension) { if (extension == null) { return null; } else { if (extension.indexOf("doc") >= 0) { extension = "doc"; } if (extension.indexOf("ppt") >= 0) { extension = "ppt"; } if (extension.indexOf("xls") >= 0) { extension = "xls"; } String lowerExtension = extension.toLowerCase(); Iterator it = this.documentFormats.iterator(); DocumentFormat format; do { if (!it.hasNext()) { return null; } format = (DocumentFormat)it.next(); } while(!format.getFileExtension().equals(lowerExtension)); return format; } } public DocumentFormat getFormatByMimeType(String mimeType) { Iterator it = this.documentFormats.iterator(); DocumentFormat format; do { if (!it.hasNext()) { return null; } format = (DocumentFormat)it.next(); } while(!format.getMimeType().equals(mimeType)); return format; } }
参考:解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常
原文 https://www.cnblogs.com/jasmine-e/p/16254454.html
我爱你域名,众多告白神器中的yyds他是中国跑得最快的人,却娶了跑得最慢的女孩。从校服到婚纱,16年爱情长跑,每周交换日记表达心意七夕又将至,风花雪月悉数为恋人们赶来,好好地看个奥运会,都被塞一把狗粮,这个七夕岂不甜
从韩国公司赎回,端午节域名来之不易众所周知,农历五月初五是端午节(DragonBoatFestival),又称端阳节午日节五月节龙舟节等,叫法有二十多个。端午节为中国国家法定节假日之一,已并被列入世界非物质文化遗产
建站疑问我们的公司很小,有必要做网站吗?新网建站资讯数字化信息技术不断发展的现在,看着各个大企业美观大气的企业官网,中小企业说没想法是假的,毕竟企业官网是一个企业的门面,自然越好看功能越多越好。但有很多小企业觉得,我就是
异种肾移植(移植动物的肾脏)方面又有好消息,好事频出啊刚接到新的植入人工肾方面的喜讯可植入人工肾脏,又有什么研究进展?没想到在异种肾移植方面的曙光又出现了!好事频出啊!其实,机器代替肾脏始终没有完整的肾脏好,因为真实的肾脏其实太精妙太
红旗H9销量出炉,9月卖出2270台,这样的表现你猜到了吗?要问中国汽车市场中最大赢家是谁,我想一定是德系车,为何?大众品牌在华深耕多年,如今减配虽然已是众所周知,然而追捧者仍是数不胜数。而德系三大马车BBA,在中国豪华汽车市场更堪称是只手
厚道的吉利SUV,跌至7万多仍配1。8T,9个月销量近16万厚道二字对于国产车而言,几乎都是共同优点,且很多车企都凭借着厚道的优点,在家用车市场中拥有一席之地。其中被消费者誉为国产一哥的吉利,旗下便有很多高性价比的车型出现在销量排行榜前列。
AdGuardMac广告拦截软件,除广告外,还会保护什么?AdguardMac破解版是一款独立的广告拦截软件,全新的UI设计,新的助手,虽然简约但功能齐全,更加的实用,新增的CoreLibs过滤器,更加安全绿色的过滤掉您的广告内容,那除广
六月六晒家谱,还挺有讲究的六月六,晒家谱农历六月六,虽然不算一个很大的节日,但是这一天在很多不同的民族中间,也都有着不同的意义。民间有很多和六月六相关的话,例如六月六,人晒衣裳龙晒袍。六月六,晒家谱,等。六
中元节是传统,并非迷信每年农历七月十五日为中元节,中元节是道教的名称,佛教称这一天为盂兰盆节。在民间,很多百姓纷纷在这一个节日的前后选择用放河灯焚纸钱等方式来祭祖,缅怀祖先。随着时代的发展,有很多人却认
家族人太多,修谱还能管用吗?家谱家中有家谱传承的人都知道,家谱除了记录一个家族的历史发展,其中众多的族人信息也是家谱中很重要的一部分信息。随着时代的发展,有的家族人丁兴旺,族人也越来越多,甚至因为发展的需要,
六月六,晒家谱,你家有晒家谱吗?农历六月六,晒家谱,是很多宗亲家族的大事。古人有言家之兴替,在于礼义,不在于富贵贫贱。家谱记录一个家族的发展,在中华几千年的历史文化长河中,不管家族是否富贵或贫穷,一本本家谱都在讲