模仿百度文库——FLASHPAPER 服务端打印之终极解决(转)
时间:2010-10-18 来源:junetan
哥在一个制造业上班,图纸管理是老大难。从去年年底开始,就一直在琢磨着FLASHPAPER如何从服务端打印。看到网上许多哥们有同样经历,斗胆拿出来分享经验。
整体思路:
一) 客户端上传上来文件。
二) 服务端调用flashpaper
实际上进程有:cmd.exe|admimistrator 文件默认打开程序|network service flashprinter.exe|network service。出现顺序亦按此顺序。
首先,打开CMD,执行命令
接着,默认程序解析文件
最后,打印机打印文件
此处关键点详见第1部分
三) 服务端打印出.swf文件。
此处关键点详见第3部分
四) 由于.swf文件生成耗时较长,客户端需不断检查该文件是否生成,若生成,则打开,否则3S后再检查。检查方法详见第4部分。
------------------------------------------------------------------------------------------------------------------------------------------------
关键点:
1、程序的调用:
关键是在服务端生成一个temp文件,从服务端调用CMD执行此文件,此文件内容为命令。避开权限的限制。
请注意:建议用.net环境。
红色代码为关键代码
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="system.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title><%=request("holeurl")%></title>
<%
dim but as string
dim url,holeurl
holeurl=Request.QueryString(Server.UrlDecode("url"))
url=Right(cstr(holeurl),Len(cstr(holeurl))-InStr(CStr(holeurl),"/"))
holeurl=Replace(holeurl,"/","\")
response.write (holeurl)
dim cmdtxt =" E:\flashpaper\flashprinter.exe E:\" & holeurl & " -o E:\swf\" & url &".swf"
response.write(cmdtxt)
dim tempfile as string=server.MapPath(".") & "\" & "test.txt"
shell("cmd.exe /c " & cmdtxt & " > " & tempfile,,true,20000)
dim myread as new streamreader(tempfile,encoding.default)
but=replace(myread.readtoend,vbcrlf,"<br>")
but=replace(but," "," ")
myread.close
file.exists(tempfile)
file.delete(tempfile)
%>
2、系统环境的配置
这里可以说是全文的核心了吧,很多人都是在这里卡住壳了。
首先,你下的flashpaper 原版的不如绿色的好用...汗!!
给个网址 :http://down.orsoon.com/%CD%BC%CE%C4%B4%A6%C0%ED/Flash%20%C0%B9/0512/FlashPaper.rar
flashpaper绿色版。安装方法里边有。
曾经装了正版的flashpaper,提示flash.ocx不能注册。
请用360卸载了,删注册表。然后装这个盗版的,呵呵。
其次,关于权限的配置。
估计95%的人郁闷都是在这里了。上边的程序写的再正确,也不能正常调用。
解决办法异常简单,请把network service 账户加入administrators组。
没办法,就是这么恐怖。确实比较危险。
修改后别忘重启IIS。
(我在2003下是network service,但是据说XP的好像是 aspnet 。不过给大家个判断方法,从网页上调用下flashpaper,别给参数,就让他在哪儿吭哧吭哧的卡着,这样才能看清楚任务管理器里账户是谁,那么就把这个账户添加到administrators组。)
3、读取生成的SWF文件。
由于.swf文件生成耗时较长,客户端需不断检查该文件是否生成。
像tXt、图片等,生成比较快,越1s,但是WORD、PDF等就比较慢,曾经有章DWG图,原图60M,我的XEON服务器足足编译了半小时。
这里关键是这红色代码。意思是,判断服务端反馈时间,如果反馈时间太长,说明.swf还没生成。
<div align="center">
请耐心等待<span id="BackSecs" style="color: #FF0000;"></span>
</div>
<div align="center">
<img src="img/wait.gif" width="70" /></div>
<script language="javascript">
//检测URL是否存在,不存在则延迟并处理,生成文件后告警并跳转。
function countDown(Secs) {
BackSecs.innerText=Secs;
if(Secs>0) {
setTimeout("countDown("+Secs+"-1)",1000);
}
else {
getURL("swf/<%= url %>.swf")
//
}
}
function getURL(url)
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("GET",url,false);
xmlhttp.send();
if (xmlhttp.readyState==4){
if(xmlhttp.Status==200){
alert("解析成功");
window.location="flash.asp?url="+escape('<%=url%>');
} else
countDown(3);
}
}
//user like this:
getURL("swf/<%= url %>.swf")
</script>
4、模板问题。
flashpaper好就好在兼容格式多,特别是office系列。但是打印出来的文件都带个flashpaper图标,还有打印的按键。很不爽
但是,这是可以改变的。
flashpaper安装目录下有个Interface文件夹,里边的文件就是模板-DefaultViewer.swf
每当程序从文件获取信息,形成帧后,外边套的就是这个DefaultViewer.swf。
其作用就相当于瓶子,里边的水就是内容。
不想要图标和按键直接改变模板即可
修改方法
1)反编译DefaultViewer.swf。
推荐工具:硕思闪客精灵
2)使用方法网上一大堆,在反编译出来的fla上,直接删,把什么图标的能换就换,不爽的按钮想删就删。
3)生成新的DefaultViewer.swf,替换原来的
这样,我们局可以定制我们自己喜欢的界面了。
——————————————————————————————————————————————————————————
进阶讨论:
1、DefaultViewer.swf里边没有旋转按钮,不爽。哪位达人帮忙做个
2、DefaultViewer.swf全屏只是网页全屏,不爽。哪位达人帮忙做个像土豆网那样的。
3、不知道有没有能播放swf的SWF。这样看的人只能下下来外边播放的swf,里边的却下不下来。
4、哥不喜欢VS,麻烦。但是羡慕net的速度。麻烦哪位达人全部实现后共享下源码。谢谢
5、哥的球球:290804452。