c# 如何实现web打印插件

目录
  • 客户端程序(Winform)
    • 1、监听Web端的WebSocket消息,这里有用到三方包:Fleck,开箱即用,非常方便。
    • 2、处理Html,将Html转换为图片:
    • 3、打印图片
  • 其他的实现思路
    • 第一种
    • 第二种

最近,客户有个需求过来,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();
            //}

            // 预览打印
            //PrintPreviewDialog pvDialog = new PrintPreviewDialog();
            //pvDialog.Document = imgToPrint;
            //pvDialog.ShowDialog();
        }

        /// <summary>
        /// 打印开始事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void imgToPrint_BeginPrint(object sender, PrintEventArgs e)
        {
            if (imageList.Count == 0)
                imageList.Add(imageFile);
        }

        /// <summary>
        /// 打印结束事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void imgToPrint_EndPrint(object sender, PrintEventArgs e)
        {

        }

        /// <summary>
        /// 设置打印内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void imgToPrint_PrintPage(object sender, PrintPageEventArgs e)
        {
            // 图片文本质量
            e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
            // 图片插值质量
            e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            // 图片合成质量
            e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
            // 图片抗锯齿
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            // 设置缩放比例
            e.Graphics.PageScale = 0.3F;
            using (Stream fs = new FileStream(imageList[printNum].ToString().Trim(), FileMode.Open, FileAccess.Read))
            {
                System.Drawing.Image image = System.Drawing.Image.FromStream(fs);
                int w = image.Width;
                int h = image.Height;
                // 绘制Image
                e.Graphics.DrawImage(image, 40, 40, 410, 600);
                if (printNum < imageList.Count - 1)
                {
                    printNum++;
                    // HasMorePages为true则再次运行PrintPage事件
                    e.HasMorePages = true;
                    return;
                }
                e.HasMorePages = false;
            }
            // 设置打印内容的边距
            //e.PageSettings.Margins = new Margins(40, 40, 40, 40);
            // 设置是否横向打印
            e.PageSettings.Landscape = false;
            // 设置纸张大小
            e.PageSettings.PaperSize = paperSize;
            // 设置打印分辨率
            e.PageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;
        }
    }

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

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

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

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

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

其他的实现思路

第一种

安装一个打印客户端 用grid++实现打印模板

本地起一个 WebSocketServer 客户端接收信息然后 组装模板打印即可。

第二种

通过webBrowser实现打印功能,只适用于文本

//转到某个网址
webBrowser.Navigate("");
//直接打印
 webBrowser.Print();
 //预览
 webBrowser.ShowPrintPreviewDialog();
 //打印
 webBrowser.ShowPrintDialog();

以上就是c# 如何实现web打印插件的详细内容,更多关于c# 实现web打印插件的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#操作Word打印的示例

    话不多说,解释在代码注释中-- class PrintClass { #region 全局变量 private DataGridView datagrid;//需要打印的数据来源 private PageSetupDialog pagesetupdialog; private PrintPreviewDialog printpreviewdialog; int currentpageindex = 0;//当前页的编号 int rowcount = 0;//数据的行数 public Size P

  • C# winform打印excel的方法

    前言 c#做winform程序要求生成并打印Excel报告,为了不安装Office相应组件,我选择了NPOI来生成Excel报告,用winform的PrintDocument控件来触发打印操作,而难点在于如何将excel转换成Graphics对象,在NPOI中我只找到了excel打印的设置(如横向/纵向),还需要打开excel去触发打印操作,但项目要求是一次性直接实现打印,要用PrintDocument控件而不是再去操作excel.不得已重新搜索,发现了类库Spire.xls,最终实现了要求.有

  • C#实现扫描枪扫描二维码并打印(实例代码)

    1.使用usb口输入的扫描枪,这里实现使用了winform 首先创建一个CS文件 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace am_sign { class BardCodeHooK { public delegate voi

  • C#打印PDF文档的10种方法(小结)

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些归纳总结,这里归纳了10种打印需求及方法.如下: 使用默认打印机打印PDF文档 使用虚拟打印机(Microsoft XPS Document Writer)打印PDF文档 指定打印机及PDF文档打印页码范围 静默打印PDF文档 双面打印PDF文档 黑白打印PDF文档 打印PDF文档时选择不同的出纸盒

  • C#利用PrintDocument定制打印单据的小例子

    前言 本文是利用PrintDocument定制打印单据的小例子,仅供学习分享使用,如果不足之处,还请指正. 涉及知识点: PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象. PrintPreviewControl :表示 Windows 窗体应用程序打印预览的原始预览部分,没有任何对话框或按钮. Graphics :GDI+绘图对象 PrinterSettings:设置打印机属性,如:设置属性Copies,可以设置打印份数,默认为1,

  • c#使用Aspose打印文件的示例

    最近在研究winform打印文件,需要支持word,excel,ppt,pdf,图片这几种格式,不能依赖相关软件环境,研究后决定使用Aspose套件将相关文件全部转换成pdf后打印 WrodToPDF 使用Aspose.Word 11.9,需要配合licence文件破解 //去水印 string licenseFile = "Aspose.Words.lic"; if (File.Exists(licenseFile)) {     Aspose.Words.License licen

  • c# 实现打印机状态查询与阻塞打印

    在使用winform编写自动打印服务的过程中,发现只要进行了打印命令的调用,文档就会进入到打印等待队列,如果打印机无法正常工作,则会影响到相关业务数据的正确转换,所以需要检查打印机的状态来保障每次打印时打印机处于空闲状态,打印时队列中也只能有一个文档,本文是通过引用System.Management来实现对打印机状态的查询 打印机状态获取 enum PrinterStatus { 其他 = 1, 未知 = 2, 空闲 = 3, 打印 = 4, 预热 = 5, 停止打印 = 6, 脱机 = 7,

  • c# winform 解决PictureBox 无法打印全部图片的问题

    作者:沐汐 Vicky 出处:http://www.cnblogs.com/EasyInvoice 一.   问题描述 在页面使用PictureBox 加载资料图片后,点击"打印",只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属性,因此每次只能打印第1页. 三.解决方法 PictureBox控件增加打印全部页面属性,如果为True,表示打印全部页面:如果为False,保留原有逻辑不变. 在打印全部页面时,将控件的图

  • C# TSC打印二维码和条形码的实现方法

    效果图 开发.使用环境说明 安装TSC_7.3.8_M-3.exe打印机驱动,安装时选择对应的ttp 244 pro 将TSCLIB.dll复制到C:\Windows\system 驱动安装说明 选择下一步 选择安装路径,默认即可,选择下一步 选择安装打印机,选择下一步 选择其他,点击下一步 选择对应的打印机型号,点击下一步 选择USB端口,点击下一步 直接默认即可,点击下一步 驱动安装完成! TSCLIB.cs代码: using System; using System.Collections

  • C#操作excel打印的示例

    using System; using System.Data; using System.IO; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; using Microsoft.Office.Core; using Excel = Microsoft.Office.Interop.Excel; namespace WindowsFormsApplication1

  • C# 调用exe传参,并获取打印值的实例

    调用方法: string baseName = System.IO.Directory.GetCurrentDirectory(); // baseName+"/" // string fileName = @"C:\Users\59930\Desktop\20170605\WindowsFormsApp1\WindowsFormsApp1\WindowsFormsApp1\bin\x86\Debug\WindowsFormsApp1.exe"; string fi

  • 如何利用C#打印九九乘法表

    我们都背过九九乘法表,但是用C#语音for语句循环打印出九九乘法表尝试过吗? 以下为九九乘法表打印代码

  • C# 打印网页不显示页眉页脚的实现方法

    1.在IE浏览器点"打印"-"页面设置",IE的默认设置如下图 2.设置在注册表里 3.C#代码实现 4.Javascript代码实现 5.法二,使用JS修改注册表,但是失败,有机会研究一下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

随机推荐