热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FastReport+WebSocket实现浏览器打印

已知浏览器打印方式1.windows.print()对样式支持不好,一次只能打印整个页面,实现多页打印需要自己再封装2.后台生成pdf或excel,客户端使用相应程序打开文件后

已知浏览器打印方式

1.windows.print()

  对样式支持不好,一次只能打印整个页面,实现多页打印需要自己再封装

2.后台生成pdf或excel,客户端使用相应程序打开文件后打印

  操作麻烦,用户体验不好

3.ActiveX

  浏览器兼容性不好

4.封装浏览器

  不松耦合

5.浏览器通过websocket发送数据给本地打印程序,实现打印

  可以利用已有的FastReport的报告单文件,对于浏览器的兼容性也还可以

  

 

 

 

功能实现

  websocket的实现网上可以找到很多,就不详细说。因为FastReport支持SaveToString方法将报告单文件保存为字符串,这样我们可以将报表文件以字符串的格式存储再数据库中,同时FastReport支持RegisterData(IEnumerable data, string name)方法,可以很方便的实现数据源注册。我们要做的就是将报表文件以及数据以一定格式传递给打印程序,打印程序加以解析,再完成报表加载及注册数据源就可以了

  核心代码

1 public class DDReport
2 {
3 public DDReport(string src)
4 {
5 var strs = src.Split('@');
6 if (strs.Length != 2)
7 {
8 throw new ArgumentException("消息格式错误");
9 }
10
11 var report = strs[0];
12 var strSources = strs[1];
13 _report = new Report();
14 _report.LoadFromString(report);
15
16 _source = JsonUtil.DeserializeStringToDictionary<string, List<dynamic>>(strSources);
17
18 foreach (var item in _source)
19 {
20 _report.RegisterData(item.Value, item.Key);
21 }
22 }
23
24 private Report _report { get; set; }
25 private Dictionary<string,List<dynamic>> _source { get; set; }
26
27 public void Print()
28 {
29 _report.Show();
30 _report.Dispose();
31 _report = null;
32 }
33 }

DDReport对FastReport进行了简单的封装,通过构造函数实现了加载报告单,以及注册数据源。

1 public delegate void Print(string crc);
2
3 WebSocketServer server;
4 List allSockets = new List();
5 private void StartHub()
6 {
7 FleckLog.Level = LogLevel.Debug;
8 Print print = new Print(PrintR);
9 server = new WebSocketServer("ws://0.0.0.0:7181");
10 server.Start(socket =>
11 {
12 socket.OnOpen= () =>
13 {
14 Console.WriteLine("Open!");
15 allSockets.Add(socket);
16 };
17 socket.OnClose= () =>
18 {
19 Console.WriteLine("Close!");
20 allSockets.Remove(socket);
21 };
22 socket.OnMessage= message =>
23 {
24 Console.WriteLine(message);
25 try
26 {
27 DDMsg m = new DDMsg(message);
28 switch (m.Type)
29 {
30 case Start:
31
32 break;
33 case PrintReport:
34
35 Thread thread = new Thread(new ParameterizedThreadStart(PrintR));
36 thread.SetApartmentState(ApartmentState.STA);
37 thread.Start(m.Content);
38
39 break;
40 default:
41 break;
42 }
43 }
44 catch (Exception ex)
45 {
46 Console.WriteLine(ex.Message);
47 }
48 };
49 });
50
51 }
52
53 private void PrintR(object content)
54 {
55 lock (this)
56 {
57 DDReport dDReport = new DDReport((string)content);
58 dDReport.Print();
59 }
60 }

  


原文链接:https://www.cnblogs.com/sunwayj/p/15580223.html



推荐阅读
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
author-avatar
南塘所有的经筒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有