FastReport+WebSocket實現瀏覽器打印


已知瀏覽器打印方式

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<IWebSocketConnection> allSockets = new List<IWebSocketConnection>();
 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         }

  

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM