网站建设熊掌号里属于什么领域,东莞网上做公司网站,杭州网页设计制作,濮阳做网站星月网络相信大家在开发的过程中都会遇到在线预览功能#xff0c;有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能#xff1f;今天我们就来解决这一疑问#xff01;
其实#xff0c;网上还是有些公司对这一功能提供了收费服务。那么#xff0c;如何实现…相信大家在开发的过程中都会遇到在线预览功能有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能今天我们就来解决这一疑问
其实网上还是有些公司对这一功能提供了收费服务。那么如何实现免费的功能呢接下来我们就来免费实现一版本吧。
我们要实现免费用到的就是openoffice。
openoffice的原理是通过openoffice将word、ppt、excel、txt这些文件先转化成pdf文件流
另外浏览器支持pdf文件预览的话并且装了Adobe Reader XI将pdf拖拽到浏览器中是可以直接打来浏览的。
Apache OpenOffice的下载地址Apache OpenOffice - Official Download 安装包下载完成后傻瓜式安装运行就可以了。Linux的则百度一下即可。
pom文件中引入依赖
dependencygroupIdcom.artofsolving/groupIdartifactIdjodconverter/artifactIdversion2.2.1/version
/dependencydependencygroupIdorg.jodconverter/groupIdartifactIdjodconverter-core/artifactIdversion4.4.2/version
/dependency
dependencygroupIdorg.openoffice/groupIdartifactIdjurt/artifactIdversion3.0.1/version
/dependency
dependencygroupIdorg.openoffice/groupIdartifactIdridl/artifactIdversion3.0.1/version
/dependency
dependencygroupIdorg.openoffice/groupIdartifactIdjuh/artifactIdversion3.0.1/version
/dependency
dependencygroupIdorg.openoffice/groupIdartifactIdunoil/artifactIdversion3.0.1/version
/dependency
代码实现
工具类
/*** 文件格式转换工具类*/
public class FileConvertUtil {/*** 默认转换后文件后缀**/private static final String DEFAULT_SUFFIX pdf;/*** openoffice_port*/private static final Integer OPENOFFICE_PORT 8100;/*** 方法描述 office文档转换为PDF(处理本地文件)* param sourcePath 源文件路径* param suffix 源文件后缀* param ip 链接ip地址* return InputStream 转换后文件输入流*/public static InputStream convertLocaleFile(String sourcePath, String suffix,String ip) throws Exception {File inputFile new File(sourcePath);InputStream inputStream new FileInputStream(inputFile);return covertCommonByStream(inputStream, suffix,ip);}/*** 方法描述 office文档转换为PDF(处理网络文件)* param netFileUrl 网络文件路径* param suffix 文件后缀* param ip 链接ip地址* return InputStream 转换后文件输入流**/public static InputStream convertNetFile(String netFileUrl, String suffix,String ip) throws Exception {// 创建URLURL 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,ip);}return null;}/*** 方法描述 将文件以流的形式转换* param inputStream 源文件输入流* param suffix 源文件后缀* param ip 链接ip地址* return InputStream 转换后文件输入流*/public static InputStream covertCommonByStream(InputStream inputStream, String suffix,String ip) throws Exception {ByteArrayOutputStream out new ByteArrayOutputStream();OpenOfficeConnection connection new SocketOpenOfficeConnection(ip,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());}/*** Description:系统文件在线预览接口*/
public void onlinePreview(String url,String ip, HttpServletResponse response) throws BaseException {if(StringUtils.isEmpty(url)){throw new ParamException(文件路径不能为空);}//获取文件类型String[] str url.split(\\.);if(str.length0){
throw new ParamException(文件格式不正确);}
String suffix str[str.length-1];if(!suffix.equals(txt) !suffix.equals(doc) !suffix.equals(docx) !suffix.equals(xls)!suffix.equals(xlsx) !suffix.equals(ppt) !suffix.equals(pptx)){
throw new ParamException(文件格式不支持预览);}
InputStream in null;OutputStream outputStream null;try {
in convertNetFile(url,suffix,ip);outputStream response.getOutputStream();//创建存放文件内容的数组byte[] buff new byte[1024];//所读取的内容使用n来接收int n;//当没有读取完时,继续读取,循环while((nin.read(buff))!-1){
//将字节数组的数据全部写入到输出流中outputStream.write(buff,0,n);}
//强制将缓存区的数据进行输出outputStream.flush();//关流outputStream.close();in.close();} catch (Exception e) {
e.printStackTrace();if (outputStream ! null) {
//关流try {
outputStream.close();} catch (IOException e1) {
e1.printStackTrace();}
}
if(in ! null){
try {
in.close();} catch (IOException e1) {
e1.printStackTrace();}
}
}} 在Controller类的接口中调用onlinePreview即可完成在线预览功能无需任何返回参数通过输入输出流来实现在线预览。
效果图 注意如果文件是docx、xlsx、pptx会不支持的
后续会更文告诉大家如何才能够支持以上三种文件的预览
欢迎点击下方卡片关注《coder练习生》