这个已是好几个月前做的,好多细节已记得不那边清楚了。今天部署到环境还遇到不少问题。总结下。

1、office 文件实现在线预览的一般思路就是,将文件转pdf,在通过pdf.js 实现在线浏览。这其中转pdf 各个工具转换的效果有些差异,存在走样问题。

2、另一种思路是通过脚本调用office 的转换pdf功能,这种效果最好,高保真。但就是会麻烦些,依赖office 工具。

3、如果还要部署到Linux上使用哪就只能用开源的办公软件 openoffice 了。

4、jodconverter 能很好的调用openoffice 工具转换 配置也相对比较简单。

效果图:

springboot 默认集成了jodconverter 所有应用起来很方便

yml 中加入如下配置就可以了

jodconverter:
enabled: true #注意这个开关,今天部署时就遇到这个问题,排查好久才发现。
officeHome: C:\Program Files (x86)\OpenOffice 4
portNumbers: 8101,8102,8103,8104,8105
maxTasksPerProcess: 5

核心代码:

  public boolean office2pdf(FileEntity fileEntity, String suffix) {
LOG.info("call office to pdf ,file info:" + fileEntity.toString());
File file = new File(fileEntity.getAbsolute_path());
if (file.exists() && file.isFile()) {
LOG.info("call office to pdf ,find file info:" + fileEntity.toString());
try {
File pdfFile = new File(file.getParentFile(), fileEntity.getPrn() + suffix);
if (!pdfFile.exists()) {
DocumentConverter documentConverter = szAppConfig.getBeanByClass(DocumentConverter.class);
documentConverter.convert(file).to(pdfFile).execute();
if (".html".equalsIgnoreCase(suffix)) {
try {
String htmlFormant =
"<script src=\"" + sz_ng_root_path + "/commons/js/333614537928.js\"></script>\n" +
" <STYLE>\n" +
" \n" +
" BODY, DIV, TABLE, THEAD, TBODY, TFOOT, TR, TH, TD, P {\n" +
" font-family: \"微软雅黑\";\n" +
" font-size: x-small\n" +
" }\n" +
"\n" +
" TABLE {\n" +
" margin: 0 auto;\n" +
" border-collapse: inherit;\n" +
" }\n" +
"\n" +
" .tabBox {\n" +
" border-bottom: 1px solid #ccc;\n" +
" padding-bottom: 1px;\n" +
" height: 30px;\n" +
" line-height: 30px;\n" +
" color: #696969;\n" +
" }\n" +
"\n" +
" .tabBox a {\n" +
" float: left;\n" +
" font-family: \"微软雅黑\";\n" +
" cursor: pointer;\n" +
" padding: 0px 25px 0px;\n" +
" font-size: 13px;\n" +
" height: 30px;\n" +
" line-height: 30px;\n" +
" background: #F4F5F9;\n" +
" border-top: 1px solid #C5D0DC;\n" +
" border-left: 1px solid #C5D0DC;\n" +
" border-bottom: 1px solid #C5D0DC;\n" +
" }\n" +
"\n" +
" .tabBox a.current {\n" +
" border-bottom: 0px;\n" +
" border-top: 2px solid #7599DE;\n" +
" font-size: 13px;\n" +
" color: #343434;\n" +
" background: #FFFFFF;\n" +
"\n" +
" }\n" +
"\n" +
" .tabBox a:last-child {\n" +
" border-right: 1px solid #C5D0DC;\n" +
" }\n" +
"\n" +
" .tabDetail {\n" +
" display: none;\n" +
" }\n" +
" </STYLE>\n" +
"\n" +
"\n" +
"<script type=\"text/javascript\">\n" +
" $(function () {\n" +
" var tabs = $(\"[href^='#table']\");\n" +
" $(\"H1:contains('摘要')\").remove();\n" +
" tabs.wrapAll(\"<p class=\\\"tabBox\\\"></p>\");\n" +
" tabs.removeAttr(\"href\");\n" +
" var tabContents = $(\"a[NAME]\");\n" +
" tabContents.each(function () {\n" +
" var tcid = $(this).attr(\"name\");\n" +
" var tc = $(this).next();\n" +
" var tcl = $(this).prev();\n" +
" $(this).wrap(\"<div class=\\\"tabDetail\\\"></div>\")\n" +
" tc.appendTo($(this).parent());\n" +
" tcl.appendTo($(this).parent());\n" +
" });\n" +
" });\n" +
" $(function () {\n" +
" $($('.tabBox > a')[0]).attr(\"class\",\"current\");\n" +
" $($('.tabDetail')[0]).show();\n" +
" $('.tabBox > a').on(\"click\",function(){\n" +
" var num=$(this).index();\n" +
" console.log(num)\n" +
" $('.tabBox > a').each(function(){\n" +
" if($(this).index()==num){\n" +
" $(this).attr(\"class\",\"current\");\n" +
" $('.tabDetail').hide();\n" +
" $($('.tabDetail')[num]).show();\n" +
" }else{\n" +
" $(this).attr(\"class\",\"\");\n" +
" }\n" +
" });\n" +
" });\n" +
" });\n" +
"</script>\n" +
"</HTML>";
RandomAccessFile raf = new RandomAccessFile(pdfFile.getAbsolutePath(), "rw");
long lastPoint = 0; //记住上一次的偏移量
String line = null;
while ((line = raf.readLine()) != null) {
final long ponit = raf.getFilePointer();
if (line.toUpperCase().contains("</HTML>")) {
String str = line.toUpperCase().replace("</HTML>", htmlFormant);
raf.seek(lastPoint);
raf.write(str.getBytes("gb2312"));
}
lastPoint = ponit;
}
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
LOG.info("call office to pdf ,convert over. file info:" + fileEntity.toString());
}
return true;
} catch (OfficeException e) {
e.printStackTrace();
LOG.info(
"call office to pdf ,thrown error info:" + e.toString() + ", file info:" + fileEntity
.toString());
return false;
}
}
return false;
}

上面有一个任意读写文件,是为了加入自定已的js 来控制excle 的展示样式。反正当时纠结了好久。

pom:

<!--open office-->
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-local</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>juh</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>jurt</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>ridl</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>unoil</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>unoloader</artifactId>
<version>5.4.2</version>
</dependency>

代码就这么些着实有些简洁,却实现了一个看着不那么容易的功能。

springboot jodconverter openoffice 实现 office 文件 在线预览的更多相关文章

  1. 使用jodconverter和swftools实现文件在线预览

    参考:仿百度文库解决方案(四)——利用JODConverter调用OpenOffice.org服务转换文档为PDF 文档在线预览主要用到如下两个工具 1,安装openoffice(同时下载jodcon ...

  2. office文件在线预览,模仿网易邮箱在线预览的

    最近研究了半天,代码是倾情奉送啊,C#,asp.net的 这个原理是office文件转换为PDF文件,然后再转换成SWF文件,FlexPaper+swfTools. 有个问题,需要在web.confi ...

  3. 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程

    大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...

  4. 文件在线预览doc,docx转换pdf(一)

    文件在线预览doc,docx转换pdf(一) 1. 前言 文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库 ...

  5. asp.net word ecxel类型文件在线预览

    asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...

  6. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

  7. kkfileview v2.0 发布,文件在线预览项目方案

    kkfileview文件在线预览 此项目为文件文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署,部署好后可以独立提供预览服务,使用http接口访问,不需要和应用集成,具 ...

  8. office文件的预览

    使用FlexPaper实现office文件的预览(C#版) 需求很简单,用户上传office文件(word.excel.ppt)后,可以预览上传的这些文件.搜索的相关的资料后.整理如下: Step1. ...

  9. 使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误

    首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 <iframe src="<c:url value="js/gen ...

  10. C# WebAPI 文件在线预览

    最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...

随机推荐

  1. 在windows 7下构建 FTP 服务器

    首先我们在C盘建立两个文件夹,用于发ftp的上传和下载 其次我们找到控制面板>程序>打开或关闭windows功能 进入后找到Internet 信息服务>FTP服务器>确定! 选 ...

  2. Django Cannot assign "A1": "B1" must be a "C1" instance.

    Django Cannot assign "A1": "B1" must be a "C1" instance. 原因:使用了外键 说明:如 ...

  3. 像MIUI一样做Zabbix二次开发(3)——Zabbix深度定制的意义

    深度定制的意义 综合来讲,Zabbix是一个非常强大的监控平台,简单拿来完成监控一些Hosts,没有什么问题,而且,目前国内大部分客户都是这么做的,基本上是安装完后,网上找到一些相关模板,配置后把Ho ...

  4. ssh_remote_without_password

    2 machines, 1 called client , 1 called server , server need static ip address. client connects serve ...

  5. Win10 ISS Web服务器安装与部署

    Win10 ISS Web服务器安装与部署 安装 ISS 控制面板-->程序-->启用或关闭 Windows 功能-->Internet Information Services 测 ...

  6. vscode 部分替换(正则替换)

    1. 数字 \d{n} 2. 数字和字母 [A-Za-z0-9]{n} 常用运算符与表达式 ^ 开始 () 域段 [] 包含,默认是一个字符长度 [^] 不包含,默认是一个字符长度 {n,m} 匹配长 ...

  7. 多个el-table在使用v-if在同一页面切换渲染时相互影响的解决办法

    解决办法 给每个el-table设置一个唯一的key值,如: <el-table key='uniqueName' ></el-table> <el-table key= ...

  8. 1326. 灌溉花园的最少水龙头数目 (Hard)

    问题描述 1326. 灌溉花园的最少水龙头数目 (Hard) 在 x 轴上有一个一维的花园.花园长度为 n,从点 0 开始,到点 n 结束. 花园里总共有 n + 1 个水龙头,分别位于 [0, 1, ...

  9. linux 部署python 系统服务管理命令 yum源设置 linux定时任务 python在linux的虚拟环境安装以及使用

    安装python3 三种方式 ==linux下很多脚本默认都用python2, 所以不要把python3的执行文件改为python,因为linux里默认python就是运行python2版本 == y ...

  10. 杭电oj 蟠桃记

    Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...