文件在线预览doc,docx转换pdf(一)
文件在线预览doc,docx转换pdf(一)
1. 前言
文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库产品的基本要素,初识阅读时同时绞尽脑汁,自己开发?,集成第三方?都是中小企业面临的一大难题…….
自己在网上搜索着找到poi开源出来的很多例子,最开始是用poi把所有文档转换为html,
1) 在github上面找到一个https://github.com/litter-fish/transform完整的demo,你想要的转换基本都提供,初学者可以参照实现转换出来的基本样子,达到通用级别,需要自己花很多功夫。此开源代码是基于poi和itext(pdf)的转换方式。
2) https://gitee.com/kekingcn/file-online-preview这是开源中国提供的一个源码,基于jodconverter,原理是调用windows,另存为的组件,实现转换。
3) 收费产品例如【永中office】【office365】【idocv】、【https://downloads.aspose.com/words/java】
2. 转换思路
自己在尝试过很多后,也与永中集成了文档转换,发现,要想完成预览的品质,必须的做二次渲染。毕竟永中做了十几年文档转换我们不能比的,自己琢磨后,发现一个勉强靠谱的思路,doc和docx都转换为pdf实现预览。都是在基于poi的基础上。
2.1. Doc转换pdf
1) Doc转换为xml
/**
* doc转xml
*/
public String toXML(String filePath){ try{ POIFSFileSystem nPOIFSFileSystem = new POIFSFileSystem(new File(filePath)); HWPFDocument nHWPFDocument = new HWPFDocument(nPOIFSFileSystem);
WordToFoConverter nWordToHtmlConverter = new WordToFoConverter(
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
PicturesManager nPicturesManager = new PicturesManager() { public String savePicture(byte[] arg0, PictureType arg1,String arg2, float arg3, float arg4) {
//file:///F://20.vscode//iWorkP//temp//images//0.jpg
//System.out.println("file:///"+PathMaster.getWebRootPath()+ java.io.File.separator + "temp"+java.io.File.separator+"images" + java.io.File.separator + arg2);
// return "file:///"+PathMaster.getWebRootPath()+java.io.File.separator +"temp"+java.io.File.separator+"images" + java.io.File.separator + arg2;
return "file:///"+PathMaster.getWebRootPath()+java.io.File.separator +"temp"+java.io.File.separator+"images" + java.io.File.separator + arg2;
}
}; nWordToHtmlConverter.setPicturesManager(nPicturesManager);
nWordToHtmlConverter.processDocument(nHWPFDocument);
String nTempPath = PathMaster.getWebRootPath() + java.io.File.separator + "temp" + java.io.File.separator + "images" + java.io.File.separator;
File nFile = new File(nTempPath); if (!nFile.exists()) {
nFile.mkdirs();
}
for (Picture nPicture : nHWPFDocument.getPicturesTable().getAllPictures()) {
nPicture.writeImageContent(new FileOutputStream(nTempPath + nPicture.suggestFullFileName()));
}
Document nHtmlDocument = nWordToHtmlConverter.getDocument();
OutputStream nByteArrayOutputStream = new FileOutputStream(OUTFILEFO);
DOMSource nDOMSource = new DOMSource(nHtmlDocument);
StreamResult nStreamResult = new StreamResult(nByteArrayOutputStream); TransformerFactory nTransformerFactory = TransformerFactory.newInstance();
Transformer nTransformer = nTransformerFactory.newTransformer(); nTransformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
nTransformer.setOutputProperty(OutputKeys.INDENT, "YES");
nTransformer.setOutputProperty(OutputKeys.METHOD, "xml"); nTransformer.transform(nDOMSource, nStreamResult); nByteArrayOutputStream.close(); return ""; }catch(Exception e){
e.printStackTrace();
}
return "";
}
2) Xml转换为pdf
这里我是使用fop通过xml转换为pdf,也是最近欣喜的一个发现,poi官网推荐的我一直没去仔细看,里面的架包和永中的很多高清包,一模一样,现在貌似路子对了。有兴趣者研究去吧。我的源码已经在githubhttps://github.com/liuxufeijidian/file.convert.master/tree/master上面,环境已经配置好,需要准备好doc和docx文档即可。
/*
* xml 转pdf
*/
public void xmlToPDF() throws SAXException, TransformerException{
// Step 1: Construct a FopFactory by specifying a reference to the configuration file
// (reuse if you plan to render multiple documents!)
FopFactory fopFactory = null;
new URIResolverAdapter(new URIResolver(){
public Source resolve(String href, String base) throws TransformerException {
try {
URL url = new URL(href);
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "whatever");
return new StreamSource(connection.getInputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
OutputStream out = null;
try { fopFactory = FopFactory.newInstance(new File(CONFIG)); // Step 2: Set up output stream.
// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams). out = new BufferedOutputStream(new FileOutputStream(OUTFILEPDF)); // Step 3: Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); // Step 4: Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); // identity transformer // Step 5: Setup input and output for XSLT transformation
// Setup input stream
Source src = new StreamSource(OUTFILEFO); // Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Step 6: Start XSLT transformation and FOP processing
transformer.transform(src, res); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//Clean-up
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
2.1.3
很多时候我们是使用word直接转的html,但是需要自己写二次渲染的代码,较为复杂,我是使用迂回方法,doc转xml,再用xml转换pdf,转换出来的pdf用pdfjs渲染即可实现和浏览器打开一样的预览,pdfjs预览方法详情见https://blog.csdn.net/liuxufeijidian/article/details/82260199
ending:大家都想看效果如何,https://github.com/litter-fish/transform,github获取改源码,配置好doc和docx文档即可实现转换,接下来会继续努力不间断优化和更新文档转换。
文件在线预览doc,docx转换pdf(一)的更多相关文章
- 怎么在线预览.doc,.docx,.ofd,.pdf,.wps,.cad文件以及Office文档的在线解析方式。
前言 Office文件在线预览是目前移动化办公的一种新趋势.Office在线预览指的是Office系列的文件在线查看而不依附域客户端的存在.在浏览器或者浏览器控件中可以预览查看Word.PDF.Exc ...
- 【ASP.NET 进阶】仿百度文库文档在线预览(支持格式.pdf,.doc,docx,xls,xlsx,.ppt,pptx)
在[ASP.NET]PDF文件在线预览(类似百度文库)基础上进行了office文件到pdf文件的转换,然后在显示出来,效果如下: 问题说明: 1.请通过以下方式添加 Office COM 组件. 2. ...
- 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html
#网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...
- 使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误
首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 <iframe src="<c:url value="js/gen ...
- C# WebAPI 文件在线预览
最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...
- kkfileview v2.0 发布,文件在线预览项目方案
kkfileview文件在线预览 此项目为文件文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署,部署好后可以独立提供预览服务,使用http接口访问,不需要和应用集成,具 ...
- 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程
大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...
- asp.net word ecxel类型文件在线预览
asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...
- 前端实现文件在线预览txt,pdf,doc,xls,ppt几种格式
做法就是使用iframe标签 1.text,pdf的文件预览 <iframe class="filename" :src="文件的地址" width='1 ...
随机推荐
- 使用hexo在GitHub上无法上传博客
原以为是秘钥或者其他错误,后来发现是邮箱设置的问题 在GitHub的你账号网页上右上角,个人的登录退出的位置,找到setting: setting->emails->Keep my ema ...
- vue-router跳转
当使用$router.push()操作时,如果路由不加反斜杠会自动替换当前路由的最后一个反斜杠后面部分
- Homework:工作日 还是周末
/* 程序功能: 要求用户从键盘输入1~7之间的整数 如果输入的是1~5, 提示用户是工作日,要努力工作: 如果输入的是6或7,提示用户是休息日,放松休息: 否则,提示用户输入不在合法范围 */ #i ...
- thinkphp 5 _initialize 使用问题
如果继承的是common的话.控制器的_initialize要先继承父类的_initialize parent::_initialize();
- pl/sql developer 问题总结
问题1,出现NLS_LANG和字符集(Character set)问题 安装完PL/SQL后打开,遇到如图问题. 原因:这是因为系统没有设置NLS_LANG系统变量. 解决方法:有两种方式查看. 1. ...
- 解决修改css或js文件后,浏览器缓存未更新问题
问题描述:最近在上线新版本项目的时候,发现有的用户的操作还是调用的老版本JS里面的内容,这样就造成原来新的JS里面加上的限制不能限制用户的操作,从而导致用户可以重复操作. 问题产生原因: 如果在用户之 ...
- Android 如何避免运行时奔溃
奔溃问题 android运行的时候难免会有一些空指针(NullPointerException)或者下标越界(IndexOutOfBoundsException),用户使用的过程操作某一个按钮的时候, ...
- atlium designer 我画的pcb板到出元件清单, 里面显示 Board Stack Report
1. 2.去掉选项即可 板的问题,在导出原件清单时,有一个模板选项,如果有,你就把他去掉,变成空白的,我的选上就是你的那种出错效果,去掉就好了.
- 19-01【vmware machine】虚拟机无法联网访问
问题 我本地的虚拟机上没办法访问外网,然后搞了很久很久,最终解决了. 现象 A,电脑持续运行了三天,也没有复杂的环境调整的情况下.我本地的ubuntu(使用VMWare machine创建的),突然没 ...
- Python学习笔记4基本数据类型
start:16:00 1.Python基本数据类型 (1)数字类型及其操作 整数类型 浮点数类型 浮点数间运算存在不确定尾数,不是bug 复数类型 数值运算操作符 (2)数值运算函数 . 2. ...