在线预览-Java 使用 Print2Flash 实现Office文档在线阅读

时间:2021-03-25 10:20:04

近期项目上遇到一个需求是用户上传的文档进行在线浏览,之前有过一篇使用 OpenOffice 将 word 转换成 html 页面进行展示的。现在介绍一个新的工具那就是 Print2Flash 。

      Print2Flash是一个虚拟打印机类的文档转换软件,因此只要是可打印的文档,都可以轻松转换为Flash文件,即SWF动画,特别是用于转换PDF、Word、Excel、PowerPoint等文档为SWF格式。

Print2Flash 与 Macromedia 的 FlashPaper 是同类型软件,但是SWF转换功能要增强了很多,如转换PDF为SWF格式时,支持超链接的转换。

Print2Flash 提供了4个可定制的SWF播放器主题,并且支持简体中文界面的播放器;转换过程中可设置使用的Flash Player版本,以获得最佳的兼容性,另外还可以添加水印、页面缩略图、文档权限(如禁止打印、禁止复制文本)等。

使用说明:

由于一直没有搞定虚拟打印机的安装与卸载,所以暂不提供绿色版,直接使用安装版吧,当前版本Print2Flash 3.1,安装完会有一个Print2Flash 3 Printer的虚拟打印机。不过Print2Flash在转换PPT为SWF文件时,是不如 iSpring FreeiSpring Presenter 或 PPT2Flash 强大的,毕竟后几个是专为PowerPoint 转换Flash开发的,但是Print2Flash的转换速度极快。

PDF 转换 SWF 还可以尝试下PDFZilla,如果想将SWF反过来转换成其他视频格式,则推荐使用 Free SWF Converter 以及 iWisoft Flash SWF to Video Converter

Office文档(word,excel,ppt)在线预览查看,有很多种方式:

1、调用 WebOffice 组件,进行 word 预览,要求客户端安装word,仅适用IE, word2013, IE11会提示word停止响应;

2、使用 OpenOffice 将 Word 转为 html 文档;

3、使用 FlexPaper,感觉不是很美观,不过还是可以用;

4、使用 FlashPaper,这个是很早期的产品,样式不会丢失,不过只支持32位操作系统,也没更新了,不支持64位;

5、使用 Print2Flash,效果跟 FlashPaper 差不多,它的展示效果很棒,支持文字搜索,全屏阅读,关键是样式不会有任何丢失。

下面主要介绍这个,先上个图。

在线预览-Java 使用 Print2Flash 实现Office文档在线阅读

详细操作步骤


1、下载 Print2Flash,我这是下载的是64位的,官方http://print2flash.com/download.php 有最新的版本,自己测试最好搜个破解版,因为官方版本不购买的情况下在生成的 swf 文件的底部会有版权说明,下好了直接安装,安装建议直接安装在根目录,便于后期目录调用,比如 C:\Print2Flash3;安装好了之后目录如下:

在线预览-Java 使用 Print2Flash 实现Office文档在线阅读

2、实现过程,官方的实现方式是需要注册服务,在程序里引用Interop.Print2Flash3.dll,并调用如下代码进行转换。

String fs_filename = Server.MapPath("UploadedFiles/") + FileUpload1.FileName;
String fs_convertedfilename = Server.MapPath("ConvertedFiles/") + FileUpload1.FileName + ".swf";
Print2Flash3.Server2 p2fServer = new Print2Flash3.Server2();
p2fServer.ConvertFile(fs_filename, fs_convertedfilename, null, null, null);

我这里使用的另外的方式,用java调用命令行工具执行转换命令生成swf,关键代码如下:

String converter = printFlashInstallPath+"  "+ docTempFile.getAbsolutePath() + " "+ swfTempFile.getAbsolutePath();
Runtime pro = Runtime.getRuntime();
pro.exec(converter);

printFlashInstallPath = C\:\\Print2Flash3\\p2fServer.exe

这里是我的配置文件的内容。

上面的 converter 是命令行内容,传进来两个参数,第一个是 office 文件路径,第二个是生成 swf 文件的路径,中间加空格。

*************************************************************************************************************************************************

其实这个方法是万金油,支持所有可以用命令行的调用的应用。非常实用,官方的实现方式直接忽略。

如果发现调用命令行的时候只是弹出了CMD窗口,但是没有执行命令,检查一下两个文件的路径是不是复杂或过长,特别是生成 swf 的路径,修改下路径重新测试,项目中遇到过因路径问题无法转换的问题,这时使用一个临时目录在 C:\temp 下,生成后将文件copy到自己需要的目录就OK了。

如果遇到有丢失.dll 的情况不能调用的,需要自己去下载对应的 dll,这个是根据操作系统来的,看人品了,我在部署有些机器的碰到过。

*************************************************************************************************************************************************

好的,转换说完了。

展示篇

这个其实就是做一个 swf 的展示页面,在页面上添加相关的JS,达到展示效果,方法千千万,没有什么需要详细介绍。

<!DOCTYPE HTML>
<html>
<head> <title></title>
#parse('/common/meta.jsp')
#parse('/common/core.htm')
<link type="text/css" rel="stylesheet" href="${ctx}/js/lib/works/css/picstyle.css">
<style>
#content {
width: 1000px;
margin: 24px auto 0;
}
</style>
<script type="text/javascript" language="JavaScript1.1"> var requiredMajorVersion = 9;
var requiredMinorVersion = 0;
var requiredRevision = 28; var appVersion=navigator.appVersion.toLowerCase()
var isIE = (appVersion.indexOf("msie") != -1) ? true : false;
var isWin = (appVersion.indexOf("win") != -1) ? true : false;
var isMac = /mac/.test(appVersion);
var isSafari = /webkit/.test(appVersion);
var isOpera = /opera/.test(appVersion);
var safariVersion = (appVersion.match(/version\/((?:\d|\.)+)/) || [])[1] function JSGetSwfVer(i){
if (navigator.plugins != null && navigator.plugins.length > 0) {
if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
descArray = flashDescription.split(" ");
tempArrayMajor = descArray[2].split(".");
versionMajor = tempArrayMajor[0];
versionMinor = tempArrayMajor[1];
if ( descArray[3] != "" ) tempArrayMinor = descArray[3].split("r"); else tempArrayMinor = descArray[4].split("r");
versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
} else flashVer = -1;
}
else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
else flashVer = -1;
return flashVer;
} function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
reqVer = parseFloat(reqMajorVer + "." + reqRevision);
for (i=25;i>0;i--) {
versionStr = JSGetSwfVer(i);
if (versionStr == -1) return false;
else if (versionStr != 0) {
versionArray = versionStr.split(".");
versionMajor = versionArray[0];
versionMinor = versionArray[1];
versionRevision = versionArray[2];
versionString = versionMajor + "." + versionRevision;
versionNum = parseFloat(versionString);
if (versionMajor > reqMajorVer && versionNum >= reqVer) return true; else return ((versionNum >= reqVer && versionMinor >= reqMinorVer) ? true : false );
}
}
return (reqVer ? false : 0.0);
} function GetDoc(movieName) {
var isIE = navigator.appName.indexOf("Microsoft") != -1;
return (isIE) ? window[movieName] : document[movieName];
} var P2FDocs=new Array()
function AddP2FDoc(P2FDoc) {
P2FDocs.push(P2FDoc);
} var oldonmousewheel=document.onmousewheel
function mousewheel(event) {
for (var i=0;i<P2FDocs.length;i++) {
if(event.target==P2FDocs[i]) {
var delta = 0;
if (event.wheelDelta) delta = event.wheelDelta / (isOpera ? 12 : 120);
else if (event.detail) delta = -event.detail;
if (event.preventDefault) event.preventDefault();
try {
P2FDocs[i].scrollLine(delta);
}
catch(e) {
}
return true;
}
}
return oldonmousewheel(event)
} if(isMac || isWin && isSafari && safariVersion<"4.0") {
if (typeof window.addEventListener != "undefined") window.addEventListener("DOMMouseScroll", mousewheel, false);
window.onmousewheel = document.onmousewheel = mousewheel;
} </script> </head> <body class="innerBody">
<div id="content">
<script language="JavaScript" type="text/javascript">
var width = "100%"
var height = "600px"
var align = "Middle" var name = "Print2FlashDoc"
var url = "${filePath}"
var flashvars = "" var alternateContent = 'This content requires the Adobe Flash Player. It either has not been installed yet or is prohibited by your browser security settings. Either' +
' <a href="http://www.macromedia.com/go/getflash/">click here to get Flash</a> or loosen your browser security restrictions';
if (isIE && isWin)
alternateContent += ' and then <a href="javascript:document.location.reload()">Refresh</a> this page'
alternateContent += '.' if (isIE && isWin) {
var oeTags = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' +
'width="' +
width +
'" height="' +
height +
'" align="' +
align +
'" id="' +
name +
'"' +
'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' +
requiredMajorVersion +
',' +
requiredMinorVersion +
',' +
requiredRevision +
',0">' +
'<param name="movie" value="' +
url +
'" /><param name="quality" value="best" />' +
'<param name="allowFullScreen" value="true" />' +
'<param name="allowFullScreenInteractive" value="true" />' +
'<param name="allowScriptAccess" value="sameDomain" />' +
'<param name="FlashVars" value="extName=' +
name +
flashvars +
'" />' +
alternateContent +
'<\/object>';
document.write(oeTags);
AddP2FDoc(GetDoc(name));
}
else
if (DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision)) {
var oeTags = '<embed src="' + url + '" quality="best" ' +
'width="' +
width +
'" height="' +
height +
'" align="' +
align +
'" name="' +
name +
'" ' +
'play="true" ' +
'loop="false" ' +
'quality="best" ' +
'allowScriptAccess="sameDomain" allowFullScreen="true" allowFullScreenInteractive="true"' +
'type="application/x-shockwave-flash" ' +
'pluginspage="http://www.macromedia.com/go/getflashplayer" ' +
'FlashVars="extName=' +
name +
flashvars +
'"> ' +
'<\/embed>'
document.write(oeTags);
AddP2FDoc(GetDoc(name));
}
else
document.write(alternateContent);
</script>
<noscript>
This content requires scripts to be enabled in your browser. Please enable scripts in your browser settings.
</noscript>
</div>
</body>
</html>
<script type="text/javascript">
#parse('/js/module/worksmonitor/worksmonitor-show.js');
</script>

页面上可能有些废代码,不过不影响使用。

页面里的 Script 里面的 url 需要替换成你生成的 SWF 文件,可以配上相对路径或者是输出流,我这里配置的是一个方法调用,返回输出流。

var url = "/worksmonitor/worksmonitor!showswf.action?workid=354&fileid=364&path="

下面是后端实现代码:

        String workid = Struts2Utils.getRequest().getParameter("workid");
String fileid = Struts2Utils.getRequest().getParameter("fileid"); String filePath = Config.getConfig("swf_path") + File.separator + workid + "_" + fileid + ".swf";
if (null != filePath) {
HttpServletResponse response = Struts2Utils.getResponse();
File f = new File(filePath);
if (f.exists()) {
FileInputStream is = new FileInputStream(filePath);
int i = is.available(); // 得到文件大小
byte data[] = new byte[i];
is.read(data); // 读数据
is.close();
response.setContentType("image/*"); // 设置返回的文件类型
OutputStream out = response.getOutputStream(); // 得到向客户端输出二进制数据的对象
out.write(data); // 输出数据
out.close();
}
}

如果有任何疑问,或者更简便的方法请留言,共商大技。

在线预览-Java 使用 Print2Flash 实现Office文档在线阅读的更多相关文章

  1. 浏览器在线预览pdf、txt、office文件

    //使用文件预览的原因是:TMD微信浏览器屏蔽掉文件下载链接,只好折中使用文件在线预览功能//要点:1.office文件用微软的插件打开 http://view.officeapps.live.com ...

  2. Office文档在线编辑的实现之二

    讲述了如何通过iis的webdav支持实现客户端的office直接编辑服务器上的文件,本篇将讲解如何实现客户端的office直接编辑数据库中的二进制形式保存的office文件. 实现的关键:模拟IIS ...

  3. Java版office文档在线预览

    java将office文档pdf文档转换成swf文件在线预览 第一步,安装openoffice.org openoffice.org是一套sun的开源office办公套件,能在widows,linux ...

  4. Office文档在线预览

    工具说明:通过传入文档的Web地址,即可进行Office文档的在线预览. 使用方式: 在http://office.qingshanboke.com地址后,通过url参数传入您想预览的文件路径. 如: ...

  5. Office文档在线编辑的实现之一

    因为项目的关系,研究了一下Office的在线编辑功能,写出来共享一下. Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav ...

  6. 使用WebDAV实现Office文档在线编辑

    Office的文档处理能力是非常强大的,但是它是本地资源,在Office Web App尚未成熟前,仍需要使用本地能力来进行文档编辑,可是现代的系统的主流却是B/S,所以在B/S中调用本地的Offic ...

  7. Java中几种office文档转pdf的方式

    最近公司要做office的文档,搜集了几种office文档转pdf的方式,简单的做下总结 我主要尝试了三种方式:openoffice,aspose,jacob 对他们进行了大文件,小文件,在linux ...

  8. java使用jacob将office文档转换为PDF格式

    jacob 包下载地址: http://sourceforge.net/projects/jacob-project/ 下载后,将jacob 与 jacob-1.19-x64.dll放到安装jdk目录 ...

  9. 快速实现office文档在线预览展示(doc&comma;docx&comma;xls&comma;xlsx&comma;ppt&comma;pptx)

    微软:https://view.officeapps.live.com/op/view.aspx?src=(输入你的文档在服务器中的地址):

随机推荐

  1. java学习笔记六——数组

    数组类型 数组是一种常见的数据结构,可用于存放多个数据,每一个数组元素存放一个数据,通常可以通过下标进行访问其元素. Java数组要求所有数组元素具有相同的数据类型.因此,数组元素的数据类型是唯一的. ...

  2. ASP&period;NET中常用的几个李天平开源公共类LTP&period;Common&comma;Maticsoft&period;DBUtility&comma;LtpPageControl

    ASP.NET中常用的几个开源公共类: LTP.Common.dll: 通用函数类库     源码下载Maticsoft.DBUtility.dll 数据访问类库组件     源码下载LtpPageC ...

  3. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  4. Matlab命令系列之目录操作

    Matlab命令系列之目录操作 filesep 用于返回当前平台的目录分隔符,Windows是反斜杠(),Linux是斜杠(/).有时此命令结合ispc命令使用,可以灵活的设置目录分割符. fullf ...

  5. php判断服务器是否支持Gzip压缩功能

    Gzip可以压缩网页大小从而达到加速打开网页的速度,目前主流的浏览器几乎都支持这个功能,但开启Gzip是需要服务器支持的,在这里我们简单的使用php来判断服务器是否支持Gzip功能. 新建一个php类 ...

  6. POJ ---3070 &lpar;矩阵乘法求Fibonacci 数列&rpar;

    Fibonacci   Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2  ...

  7. 迁移python project

    1.从python官网下载同版本的安装版的python,在新机器上安装同样版本的python(python底层是用C语言写的,安装python会安装c  c++用到的库) 2.拷贝united1整个文 ...

  8. mac下host配置 &plus; mac修改了环境变量却不生效:zsh&colon; command not found&colon; xxx

    https://blog.csdn.net/hlllmr1314/article/details/52228672 在/etc/profile中配置了go语言环境变量: export GOROOT=/ ...

  9. shell命令——cut

    功能:把行分成域 默认限定符为tab, -d:改变限定符 -f:指定输出力包含的域

  10. ActiveMQ使用线程池实现消息的生产与消费

    jar文件:spring3.1jar,以及 项目src路径下文件:config.properties 读取config.properties文件JAVA类: package com.lejob.lej ...