本文的实现思路主要是Web端通过WebSocket将Html发送给客户端,客户端(Winform)监听消息,接收处理后再打印,有该需求的朋友可以参考下本文
最近,客户有个需求过来,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,开箱即用,非常方便。
/// <summary>
/// ConnAndListen
/// </summary>
public static void ConnAndListen()
{ // 监听本地 45000端口
var server = new WebSocketServer($"ws://127.0.0.1:45000");
server.Start(socket =>
{
socket.OnOpen = () =>
{
// 连接成功
socket.Send("socket通讯已连接");
};
socket.OnClose = () =>
{
// 关闭连接
socket.Send("socket通讯已关闭连接");
socket.Close();
};
socket.OnMessage = message =>
{
// TODO...
};
});
}
2、处理Html,将Html转换为图片:
/// <summary>
/// GetBitmap
/// </summary>
/// <returns></returns>
public Bitmap GetBitmap()
{
WebPageBitmap Shot = new WebPageBitmap("html", "页面宽度", "页面高度");
Shot.GetIt();
Bitmap Pic = Shot.DrawBitmap("图片高度", "图片宽度");
// 设置图片分辨率
Pic.SetResolution(203.0F, 203.0F);
return Pic;
}
3、打印图片
/// <summary>
/// 图片打印
/// </summary>
public class PrintDirectClass
{
private PaperSize paperSize = null;
// 多页打印
private int printNum = 0;
// 单个图片文件
private string imageFile = ".....";
// 多个图片文件
private ArrayList imageList = new ArrayList();
/// <summary>
/// 打印预览
/// </summary>
public void PrintPreview()
{
// 打印机对象
PrintDocument imgToPrint = new PrintDocument();
#region 打印机相关设置
var pageSize = imgToPrint.PrinterSettings.PaperSizes;
paperSize = pageSize[pageSize.Count - 1];
// 打印方向设置
//imgToPrint.DefaultPageSettings.Landscape = false;
// 打印纸张大小设置
//imgToPrint.DefaultPageSettings.PaperSize = paperSize;
// 打印分辨率设置
//imgToPrint.DefaultPageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;
// 打印边距设置
//imgToPrint.DefaultPageSettings.Margins = new Margins(40, 40, 40, 40);
// 打印开始事件
imgToPrint.BeginPrint += new PrintEventHandler(this.imgToPrint_BeginPrint);
// 打印结束事件
imgToPrint.EndPrint += new PrintEventHandler(this.imgToPrint_EndPrint);
// 打印内容设置
imgToPrint.PrintPage += new PrintPageEventHandler(this.imgToPrint_PrintPage);
#endregion
// 直接打印
//imgToPrint.Print();
// 打印弹框确认
//PrintDialog printDialog = new PrintDialog();
//printDialog.AllowSomePages = true;
//printDialog.ShowHelp = true;
//printDialog.Document = imgToPrint;
//if (printDialog.ShowDialog() == DialogResult.OK)
//{
// imgToPrint.Print();
/
本文标题为:c# 如何实现web打印插件
- 如何使用C# 捕获进程输出 2023-03-10
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- c# 模拟线性回归的示例 2023-03-14
- Unity Shader实现模糊效果 2023-04-27
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- Oracle中for循环的使用方法 2023-07-04
- user32.dll 函数说明小结 2022-12-26
- Unity3D实现渐变颜色效果 2023-01-16
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- .NET CORE DI 依赖注入 2023-09-27