最近,客户有个需求过来,Web端无预览打印,美其名曰:快捷打印。

当时第一反应就是找插件,拿来主义永远不过时。找了一圈发现,免费的有限制,没限制的需要收费(LODOP真的好用)。说来就是一个简单的无预览打印,收费的诸多功能都无用武之地,总的来说性价比很低,所以就打算自己琢磨着写一个算了。刚开始总是纠结在Web端去实现直接打印,打印是实现了,结果是服务端的,客户端只能一脸懵。

后来(准备妥协了),安装了一些收费的插件发现,都需要先安装一个客户端程序,灵光乍现,解决方案这不就出来了。

思路:Web端调用客户端程序,让客户端程序去实现打印。

实现:Web端通过WebSocket将Html发送给客户端,客户端(Winform)监听消息,接收处理后再打印。

客户端(Winform)打印实现方式:

1、Html转PDF,然后打印PDF(暂时需要用到三方包)

2、Html转图片,然后通过PrintDocument打印图片

3、通过WebBrowser实现打印

按照上面的思路再去写代码,就会简单很多。

Web端的代码就不多说了,一个简单的WebSocket通信。

客户端程序(Winform)

1、监听Web端的WebSocket消息,这里有用到三方包:Fleck,开箱即用,非常方便。

 1         /// <summary>
2 /// ConnAndListen
3 /// </summary>
4 public static void ConnAndListen()
5 { 7 // 监听本地 45000端口
8 var server = new WebSocketServer($"ws://127.0.0.1:45000");
9 server.Start(socket =>
10 {
11 socket.OnOpen = () =>
12 {
13 // 连接成功
14 socket.Send("socket通讯已连接");
15 };
16 socket.OnClose = () =>
17 {
18 // 关闭连接
19 socket.Send("socket通讯已关闭连接");
20 socket.Close();
21 };
22 socket.OnMessage = message =>
23 {
24 // TODO...
25 };
26 });
27 }

2、处理Html,将Html转换为图片:

 1         /// <summary>
2 /// GetBitmap
3 /// </summary>
4 /// <returns></returns>
5 public Bitmap GetBitmap()
6 {
7 WebPageBitmap Shot = new WebPageBitmap("html", "页面宽度", "页面高度");
8 Shot.GetIt();
9 Bitmap Pic = Shot.DrawBitmap("图片高度", "图片宽度");
10 // 设置图片分辨率
11 Pic.SetResolution(203.0F, 203.0F);
12 return Pic;
13 }

3、打印图片

  1     /// <summary>
2 /// 图片打印
3 /// </summary>
4 public class PrintDirectClass
5 {
6 private PaperSize paperSize = null;
7 // 多页打印
8 private int printNum = 0;
9 // 单个图片文件
10 private string imageFile = ".....";
11 // 多个图片文件
12 private ArrayList imageList = new ArrayList();
13
14 /// <summary>
15 /// 打印预览
16 /// </summary>
17 public void PrintPreview()
18 {
19 // 打印机对象
20 PrintDocument imgToPrint = new PrintDocument();
21
22 #region 打印机相关设置
23 var pageSize = imgToPrint.PrinterSettings.PaperSizes;
24 paperSize = pageSize[pageSize.Count - 1];
25
26 // 打印方向设置
27 //imgToPrint.DefaultPageSettings.Landscape = false;
28 // 打印纸张大小设置
29 //imgToPrint.DefaultPageSettings.PaperSize = paperSize;
30 // 打印分辨率设置
31 //imgToPrint.DefaultPageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;
32 // 打印边距设置
33 //imgToPrint.DefaultPageSettings.Margins = new Margins(40, 40, 40, 40);
34
35 // 打印开始事件
36 imgToPrint.BeginPrint += new PrintEventHandler(this.imgToPrint_BeginPrint);
37 // 打印结束事件
38 imgToPrint.EndPrint += new PrintEventHandler(this.imgToPrint_EndPrint);
39 // 打印内容设置
40 imgToPrint.PrintPage += new PrintPageEventHandler(this.imgToPrint_PrintPage);
41 #endregion
42
43 // 直接打印
44 //imgToPrint.Print();
45
46 // 打印弹框确认
47 //PrintDialog printDialog = new PrintDialog();
48 //printDialog.AllowSomePages = true;
49 //printDialog.ShowHelp = true;
50 //printDialog.Document = imgToPrint;
51 //if (printDialog.ShowDialog() == DialogResult.OK)
52 //{
53 // imgToPrint.Print();
54 //}
55
56 // 预览打印
57 //PrintPreviewDialog pvDialog = new PrintPreviewDialog();
58 //pvDialog.Document = imgToPrint;
59 //pvDialog.ShowDialog();
60 }
61
62 /// <summary>
63 /// 打印开始事件
64 /// </summary>
65 /// <param name="sender"></param>
66 /// <param name="e"></param>
67 private void imgToPrint_BeginPrint(object sender, PrintEventArgs e)
68 {
69 if (imageList.Count == 0)
70 imageList.Add(imageFile);
71 }
72
73 /// <summary>
74 /// 打印结束事件
75 /// </summary>
76 /// <param name="sender"></param>
77 /// <param name="e"></param>
78 private void imgToPrint_EndPrint(object sender, PrintEventArgs e)
79 {
80
81 }
82
83 /// <summary>
84 /// 设置打印内容
85 /// </summary>
86 /// <param name="sender"></param>
87 /// <param name="e"></param>
88 private void imgToPrint_PrintPage(object sender, PrintPageEventArgs e)
89 {
90 // 图片文本质量
91 e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
92 // 图片插值质量
93 e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
94 // 图片合成质量
95 e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
96 // 图片抗锯齿
97 e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
98 // 设置缩放比例
99 e.Graphics.PageScale = 0.3F;
100 using (Stream fs = new FileStream(imageList[printNum].ToString().Trim(), FileMode.Open, FileAccess.Read))
101 {
102 System.Drawing.Image image = System.Drawing.Image.FromStream(fs);
103 int w = image.Width;
104 int h = image.Height;
105 // 绘制Image
106 e.Graphics.DrawImage(image, 40, 40, 410, 600);
107 if (printNum < imageList.Count - 1)
108 {
109 printNum++;
110 // HasMorePages为true则再次运行PrintPage事件
111 e.HasMorePages = true;
112 return;
113 }
114 e.HasMorePages = false;
115 }
116 // 设置打印内容的边距
117 //e.PageSettings.Margins = new Margins(40, 40, 40, 40);
118 // 设置是否横向打印
119 e.PageSettings.Landscape = false;
120 // 设置纸张大小
121 e.PageSettings.PaperSize = paperSize;
122 // 设置打印分辨率
123 e.PageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;
124 }
125 }

以上就是 Html转图片,然后通过PrintDocument打印图片 的实现代码了。其它两种方式大家有兴趣可以去试试。

WebBrowser 比较简单,但是对打印机控制不是特别友好(也可能是我没有发现,研究不深)

1             WebBrowser wb = new WebBrowser();
2 // 直接打印
3 wb.Print();
4 // 确认打印
5 wb.ShowPrintDialog();
6 // 预览打印
7 wb.ShowPrintPreviewDialog();

Html转PDF,然后打印PDF原理于Html转图片,然后通过PrintDocument打印图片一样,不同的是转PDF可能需要用到第三方的包,目前这方便的包还是比较齐全的,NUGET搜索pdf几乎全是。

需求总是来得特别突然,下次再有新特别需求时再来和大家分享。

以上就是这篇文章的全部内容了,有帮助的点个赞,有错误的欢迎大家指出来,有更好的解决方案也希望大家不吝赐教。

Web打印插件实现思路(C#/Winform)的更多相关文章

  1. 专业的web打印插件

    Lodop是什么?参考官方网站:http://www.lodop.net/ 有人说她是Web打印控件,因为她能打印.在浏览器中以插件的形式出现,用简单一行语句就把整个网页打印出来: 有人说她是打印编程 ...

  2. WEB打印插件Lodop

    Lodop.C-Lodop使用说明及样例   Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现 复杂打印.控件功能强大,却简单易用,所有调用如 ...

  3. WEB打印插件jatoolsPrinter

    为什么选择 jatoolsPrinter 免费版? 支持无预览直接打印 真正免费,不加水印,没有ip或域名限制,不限时间,兼容ie6+ 无须注册,下载即用 提供经过微软数字签名的cab自动安装包,安装 ...

  4. Lodop Web打印插件使用

    <object id="LODOP_OB" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" st ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-Web打印

    系列目录 前言 1.本次主要弥补工作流,用户表单数据的打印 2.使用JQprint做为web打印插件 3.兼容:FireFox,Chrome,IE. 4.没有依赖也没有配置,使用简单 代码下载:htt ...

  6. 打印方案之web打印

    前言: 前一段时间在工作中,遇到需要通过打印实现对报表或者工作流清单等事情时,都需要运用到打印功能,那么 ,这个时候你会怎么处理? 在这里,我们可以通过最简单的方式实现web打印功能,简单易懂,方便快 ...

  7. 网页WEB打印控件制作-开放源码

    在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的一件事件,本文将自己开发 ...

  8. 网页WEB打印控件

    网页WEB打印控件制作 在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的 ...

  9. Web打印控件Lodop实现表格物流单的打印

    Web打印控件Lodop实现表格物流单的打印 一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用 ...

随机推荐

  1. Windows PE第九章 线程局部存储

    线程局部存储(TLS) 这个东西并不陌生了,之前写过了一个关于这个的应用,利用静态TLS姿势实现代码段静态加密免杀或者所谓的加壳思路.地址在这:http://blog.csdn.net/u013761 ...

  2. FreeSql之Expression表达式拼接参数扩展

    在FreeSql源码中Expression表达式拼接默认最多支持到5个泛型参数,当我们使用表关联比较多的时候,就需要进行扩展. 新建一个类,将命名空间改为System.Linq.Expressions ...

  3. 在Visual Studio 中使用git——文件管理-下(六)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  4. [BUAA2021软工助教]个人阅读作业#2小结

    作业链接 见个人阅读作业#2 优秀作业推荐 Shaun_Yao ✍️ 道法之间--软工第2次博客作业 Potassium ✍️ 构之有道,建之有法--软工个人阅读作业#2 MarkDay ✍️ < ...

  5. .Net Core·寄托于IIS的REST服务405的问题

    阅文时长 | 0.48分钟 字数统计 | 828.8字符 主要内容 | 1.引言&背景 2.声明与参考资料 『.Net Core·寄托于IIS的REST服务405的问题』 编写人 | SCsc ...

  6. 关于.NET微服务最热门的问题解答

    在我们最近让我们一起学习.NET的微服务专场活动中,我们收到了一些很好的问题.我们在现场已经回答很多问题,但我们想继续回答一些在会议中出现的最热门的问题.如果你错过了现场直播,不要担心,因为你可以按需 ...

  7. [bug] CDH 安装 哈希验证失败

    分析 验证 parcel 文件的哈希值 和 sha 文件不一致:文件损坏,重新下载 和 sha 官网一致:配置httpd文件 参考 哈希值和官网不一致 https://blog.csdn.net/lv ...

  8. [笔记] 《c++ primer》书店程序 Chapter7

    Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 ...

  9. 配置trunk和access

    配置trunk和access 拓扑图 PC地址设置 PC1 :192.168.1.1 vlan10 PC2 :192.168.1.2 vlan10 交换机配置 LSW3配置 <Huawei> ...

  10. IDEA 创建 Maven 项目每次都需要重新配置问题

    问题描述 通过 File->Settings 设置 maven 配置,在 IDEA 新创建 Maven 项目时设置的 maven 配置会被重置,导致每次创建新 Maven 项目都需要重新设置一遍 ...