B/S架构是主流,但使用浏览器打印web内容并不方便,常需要用户对浏览器做一些设置,有了技术门槛。如果使用客户端程序,可以解决这个问题,但C/S架构非主流。所以考虑做个壳浏览器,用这个浏览器去访问网页,但网页中需要打印时,把打印功能的实现,交给壳浏览器实现。这样对于不懂设置浏览器的用户,可以选择使用壳浏览器。
具体思路如下:
当用普通浏览器访问时,服务器端返回的页面的打印按钮的js代码是直接调用浏览器的打印功能。
当用壳浏览器访问时,访问网址带个参数,服务器端判断到这个参数的存在,就在返回页面的打印按钮的js代码写成调转去一个特殊网址,这个特殊网址相当于一条指令,壳浏览器捕获到这条指令后,设置打印格式并打印,这样打印就完全由壳浏览器实现了。
把代码保存为testPrint.jsp,放到tomcat/webapps/ROOT下,在tomcat/lib要放一个jstl-1.2.jar,因为用到了jstl标签。启动tomcat,试试访问。
用普通浏览器访问: 用壳浏览器访问:
壳浏览器是用delphi实现的,很简单的代码,不知算不算得上是壳浏览器。只需放一个webBrowser控件,添加两个事件:FormShow事件在窗口启动时触发控件去访问网页;WebBrowser1BeforeNavigate2事件用于捕获web鼠标点击打印事件,然后接手打印。
FormShow代码:
procedure TSDIAppForm.FormShow(Sender: TObject); begin //用参数告诉服务端是在用客户端进行访问,服务端因此返回带客户端打印按钮的页面 WebBrowser1.Navigate('http://192.168.3.123:8080/testPrint.jsp?client=app'); end;WebBrowser1BeforeNavigate2代码:
procedure TSDIAppForm.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool); var params:string; pl:TStrings; i:Integer; PText:TextFile; begin //用约定的指令确定点击事件 if pos('cmd=printme',url)>0 then begin //获取要打印的内容,如果打印更复杂的内容,比如包含图片。可以至少只传回一个id,然后控件自己直接去服务器取其他内容,服务器端要有按id取内容的服务 i:=pos('?',url); params:=RightStr(url,Length(url)-i); pl:=TStringList.Create; pl.Delimiter := '|'; pl.DelimitedText := params; //只是利用url作为一个指令,不需要真正跳转 Cancel:=True; //设置打印格式并打印 printer.Canvas.Font.Charset:=GB2312_CHARSET; AssignPRN(PText); Rewrite(PText); Printer.Canvas.Font.Size:=15; writeln(Ptext,pl[0]); Printer.Canvas.Font.Size:=20; Printer.Canvas.Font.Color:=clRed; writeln(Ptext,pl[1]); Printer.Canvas.Font.Color:=clBlue; Printer.Canvas.Font.Size:=8; writeln(Ptext,pl[2]); CloseFile(Ptext); ShowMessage('done'); end; end;壳浏览器捕获到打印请求后,就可以按自己的意愿设置打印格式,调用本地打印机进行打印。
浏览器的打印
壳浏览器的打印 因没有打印机,所以用虚拟打印机生成了pdf文件。
delphi已经太老,可以参考着用别的语言实践。请问用什么语言开发客户端程序好?件用什么报表控件可以灵活设置页面格式?
代码下载: 用壳浏览器实现Web的本地灵活打印