月眸


office在线预览总结

毛毛小妖 2019-07-20 156浏览 0条评论
首页/ 正文
分享到: / / / /

很多时候我们需要在web页面来进行office文件预览。这篇文章就带大家来看一下有哪些可行的方案吧。

方法一、使用pageoffice

pageoffice是个商业性的软件,功能很强大,可以在线编辑office,预览,打印,但是需要收费,免费版的会带有一些文字,体验不是很好,预算充足的同学可以尝试一下,但是仅仅为了预览功能来使用pageoffice就显得太笨重了。具体的用法官方文档很详细,还有专门的客服,这里就不多说啦。

方法二、使用微软的免费接口

想省事儿的同学可以直接用微软提供的免费接口来预览office啦。当然了,使用这个方法需要项目能访问外网,或者你有办法能直接访问微软的ip。这个使用起来就很简单啦,一句话即可,下面代码的src直接换成自己的服务器上文档的地址即可:

<iframe src='https://view.officeapps.live.com/op/view.aspx?src=http://storage.xuetangx.com/public_assets/xuetangx/PDF/1.xls' width='100%' height='100%' frameborder='1'></iframe>

方法三、使用前后端分开的办法

什么意思呢?我们知道浏览器可以直接打开pdf文件,所以我们可以把office文件转换成pdf再在页面进行展示。基于这个思想,自然就衍生了一些转换office文件的插件和预览pdf的插件了。

1、前端

前端可用的插件有jquery.media.js和pdf.js,这个是jquery的插件,不仅可以预览pdf,还能预览各种媒体类型,使用也很easy。

1>jquery.media.js的使用

首先页面得引入两个文件

<script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> 
<script type="text/javascript" src="js/jquery.media.js"></script>

再写好我们的展示区域

<div class="panel-body">
    <a class="media" href="pdf1.pdf"></a>  
</div>

最后在js调用一下展示接口就ok了

$(function() {  
    $('a.media').media({width:800, height:600});  
});

2>pdf.js的使用

这个插件使用起来更简单,首先去百度下载pdf.js插件,放到项目中,官网地址在这里http://mozilla.github.io/pdf.js,请自行下载。然后只需要在使用到的地方使用就可以了,比如iframe,弹出框的形式

<iframe src='/js/pdfjs/web/viewer.html?file='+ encodeURIComponent('/api/doc/preViewCaseFile?docId='+docId+"&docSuffix="+docSuffix)' width='100%' height='100%' frameborder='1'></iframe>

2、后端

后端的主要工作就是将office文件转换为pdf返回给前端。这里可以使用jacob来进行转换,也是开源免费的,但是仅限于weinwods系统。这个的使用方法就不再说了,有兴趣的可以自己百度,因为现在基本都需要linux兼容。

好了,那来说下另外一种方法吧,使用aspose提供的插件,这个也是收费的,不过已经有了破解license。大家可以放心使用,有效期到2099年,应该有生之年够用了。关于jar包的下载请移步至我的github上:jar包地址

相关工具类代码如下:

package com.zhza.pdla_api.modules.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.aspose.cells.Workbook;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;

public class OfficeToPdfUtil {
	private static String inPath;
	private static String pdfFile;
	private static String docSuffix;
	
	@SuppressWarnings("static-access")
	public OfficeToPdfUtil(String inPath, String pdfFile, String docSuffix) {
		this.inPath = inPath;
		this.pdfFile = pdfFile;
		this.docSuffix = docSuffix;
	}
	
	public static void officeToPdf(){
		docSuffix = docSuffix.toLowerCase();
		if("doc".equals(docSuffix) || "docx".equals(docSuffix) || "rtf".equals(docSuffix)){
			docToPdf();
		}else if("xls".equals(docSuffix) || "xlsx".equals(docSuffix) || "csv".equals(docSuffix)){
			excelToPdf();
		}
	}

	/**
	 * 描述: word转pdf
	 * @author shengyu
	 * @param inPath
	 * @param outPath 
	 * @date:2019年7月17日 上午11:16:29
	 */
	private static void docToPdf() {
        if (!getWordsLicense()) {
            return;
        }
        FileOutputStream os = null;
        try {
            File file = new File(pdfFile);
            os = new FileOutputStream(file);
            Document doc = new Document(inPath);
            doc.save(os, SaveFormat.PDF);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
        	if(os!=null){
        		try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
        	}
        }
    }
	
	/**
	 * 描述: excel转pdf
	 * @author shengyu
	 * @param inPath
	 * @param pdfFile 
	 * @date:2019年7月17日 上午11:16:42
	 */
	private static void excelToPdf() {               
		if (!getCellsLicense()) {          
			return;       
		}
		try {           
			Workbook wb = new Workbook(inPath);
			wb.save(pdfFile);
		}catch (Exception e) {           
			e.printStackTrace();
		}
	}
	
	/**
	 * 描述: 获取wordsLicense文件
	 * @author shengyu
	 * @return 
	 * @date:2019年7月17日 上午11:13:24
	 */
	private static boolean getWordsLicense() {
        boolean result = false;
        try {
            InputStream is = OfficeToPdfUtil.class.getClassLoader().getResourceAsStream("aspose/license.xml");
            com.aspose.words.License aposeLic = new com.aspose.words.License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
	
	/**
	 * 描述: 获取excelLicense文件
	 * @author shengyu
	 * @return 
	 * @date:2019年7月17日 下午4:28:59
	 */
	private static boolean getCellsLicense() {
        boolean result = false;
        try {
            InputStream is = OfficeToPdfUtil.class.getClassLoader().getResourceAsStream("aspose/license.xml");
            com.aspose.cells.License aposeLic = new com.aspose.cells.License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

使用方法代码:

@RequestMapping("preViewCaseFile")
public void preViewCaseFile(HttpServletRequest request,HttpServletResponse response){
	String docId = request.getParameter("docId");
	String docSuffix = request.getParameter("docSuffix");
	FileOutputStream fps = null;
	byte[] bytes = getFileContentByDocId(docId,docSuffix);
	String tempFolder = System.getProperty("java.io.tmpdir");
	String dataFilePath = tempFolder + "tempDocument."+docSuffix;
	String pdfPath = tempFolder + "resultPdf.pdf";
	try {
		fps = new FileOutputStream(dataFilePath);
		fps.write(bytes);
    	fps.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
	if("pdf".equals(docSuffix)){
		pdfPath = dataFilePath;
	}else{
		OfficeToPdfUtil officeToPdfUtil = new OfficeToPdfUtil(dataFilePath,pdfPath,docSuffix);
		officeToPdfUtil.officeToPdf();
	}
	pdfStreamHandeler(request,response,pdfPath);
}


private void pdfStreamHandeler(HttpServletRequest request, HttpServletResponse response,String filePath) {
    File file = new File(filePath);
    byte[] data = null;
    try {
    	// 解决请求头跨域问题(IE兼容性  也可使用该方法)
    	response.setHeader("Access-Control-Allow-Origin", "*"); 
        response.setContentType("application/pdf");             
        FileInputStream input = new FileInputStream(file);
        data = new byte[input.available()];
        input.read(data);
        response.getOutputStream().write(data);
        input.close();
    } catch (Exception e) {
    	e.printStackTrace();
    }
}

好啦。本次就到这里,相信还有更多优秀的插件可以实现,等以后找到再完善这篇文章。

最后修改:2019-07-20 16:55:35 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

评论列表

还没有人评论哦~赶快抢占沙发吧~