Andriod中的文档在线查看功能,类似于网易邮箱大师中的附件预览功能,要求在app内直接打开office文档、pdf文档等。
思路一:后台统一转换文档格式,安卓端只预览一种格式文档。
在后台将office(Word、Excle、PPT)文档转换为pdf文档,在安卓端预览的时候,其实是从后台先把pdf文档下载到手机上,再去读取。
-
后台:openoffice + jodconverter将office文档转换为pdf格式。
集成难度不大,网上教程非常多,需要在服务器上安装openoffice,转换速度很慢(页数多特别明显,页数少的话速度在可以接受的范围之内,转换速度与文档大小关系不大,主要是文档页数)。
-
安卓端使用AndroidPdfViewer第三方库显示pdf文档。
就是使用第三方库,也很简单。
思路二:在安卓端完成文档转换
- 使用Apache的Poi组件,但是由于ppt在转换过程中需要用到java的awt,所以无法实现ppt的转换,也就是说只能实现word、excle的转换。如果项目中只是有转换word或者excle的需求,可以采用Poi。
- 具体是:使用Poi将doc、docx、xls、xlsx文档转换为html,再使用webview加载本地html。
- 这里要注意的是,Poi的jar包的导入。如果去apache的poi官网查看各组件的功能,以及要导入的jar包,但是网上的代码一般都是org.apache.poi.xwpf.converter.xhtml
这个库的。等你导入了这个库,又自己从官网上下载了poi、poi-ooxml等jar包引入后,很可能会导致编译出错,提示有重复文件。这是由于导入的jar包的版本不一致导致的。正确的导入方式可以参考下面的:
这个会自动把关联的jar包引入,从maven仓库可以看到这个jar的依赖,以及依赖的依赖,
总之很多,可以在project视图中External Libraries来查看这个库文件到底包含了哪些jar包。
compile 'fr.opensagres.xdocreport:org.apache.poi.xwpf.converter.xhtml:1.0.6'
---------------------------------------------------------------------------------------------------
这个主要是doc的转换用到的,可以不引入,网上也有很多转换方法没有用到这个库
//compile 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.document:1.0.6'
---------------------------------------------------------------------------------------------------
这个库文件的版本至关重要,因为...xhtml:1.0.6中依赖的poi等jar的版本就是3.10-FINAL,
所以这里必须也是3.10-FINAL,不然编译肯定不会通过。
compile 'org.apache.poi:poi-scratchpad:3.10-FINAL'
总之,如果你在apache.poi官网上看各个组件之间的依赖关系有些困难,可以去maven看。
- 除了引入库文件以外,还需要在app的gradle文件中添加如下语句:
defaultConfig {
...
multiDexEnabled true
...
}
packagingOptions {
...
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
dexOptions {
javaMaxHeapSize "3g"
jumboMode = true
preDexLibraries = false
}
lintOptions {
abortOnError false
}
project.tasks.withType(com.android.build.gradle.tasks.Dex) {
additionalParameters = ['--core-library']
}
思路三:其他
参考附件在线预览控件实现的市场调研
POI由于预览效果不是很好,不建议使用(安卓无法转换ppt与pptx)
Flashpaper缺少后续支持,不建议使用(后台,与安卓无关)
-
第三方付费产品中,Office Web 365
完全依赖于第三方云服务,在安全性、灵活性、稳定性为验证,不建议使用
科瀚的SOAOffice和卓正软件的pageoffice需要浏览器Activex插件的支持,对用户不是很友好,不建议试用(后台,与安卓无关)
OpenOffice的预览效果稍差,但集成方便;
Office Web Apps预览效果最佳,钉钉、126等也采用此方式,但估计集成难度稍大,另外钉钉的预览偶尔也出现不稳定的情况;
永中office的预览效果和集成难度比较平衡,但需付费。
总之,除非需求必须,否则这种功能还是不要实现,因为难度很大,耗时费力,一般情况下交给系统去打开就行了。当然,主要功能是文档阅读的app除外。
一些代码参考
说明:大部分是从网上找的,仅供参考,功能没问题,但很多细节有待完善。
package com.ght.loginapp.utilities;
import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.core.FileURIResolver;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.w3c.dom.Document;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
/**
* 2016/9/12 0012,由 yuezc 创建 .
*
* 功能描述:
*
* 说明:
* ---------------------------
* 修改时间:
* 修改说明:
* 修改人:
*
* POIFS
* POIFS是该项目的最古老,最稳定的一部分。.这是格式化OLE 2复合文档为纯Java的接口。 它同时支持读写功能。所有的组件,最终都依赖于它的定义
*
* HSSF 和 XSSF
* HSSF: MS-Excel 97-2003(.xls),基于BIFF8格式的JAVA接口。
* XSSF:MS-Excel 2007+(.xlsx),基于OOXML格式的JAVA接口。
*
* HWPF 和XWPF
* HWPF: MS-Word 97-2003(.doc),基于BIFF8格式的JAVA接口。只支持.doc文件简单的操作,读写能力有限。本API为POI项目早期开发,很不幸的 是主要负责HWPF模块开发的工程师-“Ryan Ackley”已经离开Apache组织,现在该模块没有人维护、更新、完善。
* XWPF:MS-Word 2007+(.docx),基于OOXML格式的JAVA接口。较HWPF功能完善。
*/
public class DocumentFormatConvertUtils {
/**
* doc文档转成html格式
*/
public static void doc2html(String docPath, final String docName, String htmlName, String htmlPath) {
HWPFDocument wordDocument = null;
try {
wordDocument = new HWPFDocument(new FileInputStream(docPath + docName));
} catch (IOException e) {
e.printStackTrace();
}
WordToHtmlConverter wordToHtmlConverter = null;
try {
wordToHtmlConverter = new WordToHtmlConverter(
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
//设置图片路径
wordToHtmlConverter.setPicturesManager(new PicturesManager() {
public String savePicture(byte[] content,
PictureType pictureType, String suggestedName,
float widthInches, float heightInches) {
String name = docName.substring(0, docName.indexOf("\\."));
return name + "/" + suggestedName;
}
});
//保存图片
List