C# 实现 Web 打印插件

前言

最近,客户有个需求过来,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 比较简单,但是对打印机控制不是特别友好(也可能是我没有发现,研究不深)

WebBrowser wb = new WebBrowser();
// 直接打印
wb.Print();
// 确认打印
wb.ShowPrintDialog();
// 预览打印
wb.ShowPrintPreviewDialog();

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

9c53e0f856a41d0e1444133a9a6d68cb.png

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

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

转自:畅饮无绪

链接:cnblogs.com/cool-net/p/14885323.html

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
打印机语言:PPLB 插件安装包: ArgoxWebPrintSetup.msi API类库名称:ArgoxWebPrint 操作系统:WindowsXP, Windows7 32/64bit 运行环境:IE6以上 程序测试页面:PrintDemoPage.htm 发行日期:2014-04-17 ******************************************************************************* 注意事项 =============================================================================== 1. 连接打印机开始运行PrintDemoPage.htm打印测试前,请先确认 - ArgoxWebPrintSetup.msi是否已安装完成。 - 打印机驱动是否已安装完成。 2. 请使用IE浏览器开启PrintDemoPage.htm页面,并在下方提示点击允许IE运行此ActiveXP程序。 3. 插件安装软件包名称为:Setup_ArgoX.msi,必须安装在客户端电脑。 4. 打印机接口函数用法请参阅下方说明,JS的调用方式请参考PrintDemoPage.htm脚本。 5. 你应该将DLL档案放置在哪儿? 若使用32位元的DLL: A.将DLL档案和应用程式放在同一目录下.(这是最好的方法) B.在Windows 32位元作业系统中, 将DLL档案放置在\Windows\System32目录. C.在Windows 64位元作业系统中, 将DLL档案放置在\Windows\Syswow64目录. 若使用64位元的DLL: A.将DLL档案和应用程式放在同一目录下.(这是最好的方法) B.在Windows 32位元作业系统中, 无法使用 64位元的DLL. C.在Windows 64位元作业系统中, 将DLL档案放置在\Windows\Syswow64目录. 6. 以下范例为 C# 的范例,其他程式语言不一定完全相同。
控件功能强大,却简单易用,所有调用如同JavaScript扩展语句, 主要接口函数如下: PRINT_INIT 打印初始化 SET_PRINT_PAGESIZE 设定纸张大小 ADD_PRINT_HTM 增加超文本项 ADD_PRINT_TEXT 增加纯文本项 ADD_PRINT_TABLE 增加表格项 ADD_PRINT_SHAPE 画图形 SET_PRINT_STYLE 设置对象风格 PREVIEW 打印预览 PRINT 直接打印 PRINT_SETUP 打印维护 PRINT_DESIGN 打印设计 ... 样例清单 1.如何在页面内嵌入控件见样例一 2.如何选材打印当前页面内容见样例二 3.如何用代码生成打印页见样例三 4.如何打印设计和定位套打见样例四 5.如何控制纸张大小和连续打印见样例五 6.如何输出多页长文档及双面打印见样例六 7.如何定向输出见样例七 8.如何打印图片见样例八 9.如何用程序加载打印维护背景图见样例九 10.如何控制打印样式(STYLE)见样例十 11.如何直接打印条形码见样例十一 12.如何读写本地文件见样例十二 13.如何打印旋转内容见样例十三 14.如何按URL打印见样例十四 15.如何打印表格的页头页尾见样例十五 16.如何设置预览窗口大小见样例十六 17.如何发打印机指令或直接读写端口见样例十七 18.如何打印幅面高度不固定的票据见样例十八 19.如何内嵌显示及预览时包含背景图见样例十九 20.如何强制分页并预览多页卡片见样例二十 21.如何控制打印维护的功能权限见样例二十一 22.如何构建自己的纯WEB打印预览见样例二十二 23.如何居中打印超文本见样例二十三 24.如何选择界面皮肤见样例二十四 25.如何指定输出到哪页或仅预览见样例二十五 26.如何提高多页打印的性能见样例二十六 27.如何导出数据到Excel文件见样例二十七 28.如何快速读取客户端系统信息见样例二十八 29.如何使用其它长度单位见样例二十九 30.如何分页输出页面内容见样例三十 31.如何打印表格的分页小计或合计见样例三十一 32.如何实现清晰的图表打印见样例三十二 33.如何实现甘特图等的图表打印见样例三十三 34.如何使用百分比%和满页打印见样例三十四 35.如何获得打印结果和程序代码见样例三十五 36.如何在设计过程中用js编辑内容见样例三十六 37.如何打印公章效果图见样例三十七 38.如何用BASE64编码输出图片见样例三十八 39.如何打印田字格、上划线等文本见样例三十九 40.如何进行数据格式转换见样例四十 41.如何把内容关联后按顺序打印见样例四十一 42.如何把整页内容缩放打印见样例四十二 43.如何分页打印综合表格见样例四十三 44.如何缩放打印单个超文本内容见样例四十四 45.如何获得打印状态及最终结果见样例四十五 46.如何设置右边距和下边距见样例四十六

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值