我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c# 如何实现web打印插件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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,开箱即用,非常方便。


          /// <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打印插件的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c# 如何实现web打印插件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在web前端里实现打字机插件

这篇文章主要介绍了如何在web前端里实现打字机插件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何在web前端里实现打字机插件文章都会有所收获,下面我们一起来看看吧。最简单的打字机const dom = do
2023-07-05

如何浅析C#打印和C#打印预览的实现

如何浅析C#打印和C#打印预览的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们谈到C#打印和C#打印预览的实现其中主要就是包括:页面设置、打印预览、打印
2023-06-17

Vue怎么用插件实现打印功能

这篇文章主要介绍“Vue怎么用插件实现打印功能”,在日常操作中,相信很多人在Vue怎么用插件实现打印功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么用插件实现打印功能”的疑惑有所帮助!接下来,请跟
2023-07-05

Vue集成lodop插件实现打印功能

lodop取意自“loadorprint”,是一款优秀的Web打印控件。本文将在Vue中集成lodop插件实现打印功能,感兴趣的小伙伴可以了解一下
2023-01-30

C#如何实现插件构架

这篇文章主要讲解了“C#如何实现插件构架”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现插件构架”吧!假设你设计的程序已经部署到用户的计算机上,并且能够正常运行了。但是有一天,用户
2023-06-17

php如何实现Web页面的打印功能

这篇文章主要讲解了“php如何实现Web页面的打印功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现Web页面的打印功能”吧!下面,我们先简单介绍一下能够实现打印功能的基本知识
2023-07-05

Vue中使用Printjs插件实现打印功能

Print.js主要是为了帮助我们直接在我们的应用程序中打印PDF文件,无需离开界面,也无需使用嵌入,这篇文章主要介绍了Vue中使用Printjs插件实现打印功能,需要的朋友可以参考下
2022-11-13

C++如何实现二维图形的打印

这篇文章主要介绍了C++如何实现二维图形的打印,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、下三角图形的打印#includeusing namespa
2023-06-29

C#中如何使用打印控件

C#中如何使用打印控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先弄一个printDocument控件,然后在打印的按钮中直接调用printDocument1.print
2023-06-17

C语言如何实现打印杨辉三角

这篇文章给大家分享的是有关C语言如何实现打印杨辉三角的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。题目描述打印杨辉三角(前N行)问题分析杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在
2023-06-22

java如何实现打印机的打印功能

要实现打印机的打印功能,可以使用Java中的打印机相关的API。以下是一个简单的示例代码:```javaimport javax.print.Doc;import javax.print.DocFlavor;import javax.pri
2023-09-01

web中如何实现插入排序

这篇文章主要为大家展示了“web中如何实现插入排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何实现插入排序”这篇文章吧。插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是
2023-06-28

mybatis 插件: 打印 sql 及其执行时间实现方法

Plugins摘一段来自MyBatis官方文档的文字。MyBatis允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis允许使用插件来拦截方法调用:Executor(update、query、flushStatements、c
2023-05-31

Vue利用插件实现打印功能的示例详解

这篇文章主要为大家详细介绍了Vue如何利用vue-print-nb插件实现打印功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一下
2023-03-19

java如何实现打印功能

在Java中,可以使用System.out.println()方法实现打印功能。这个方法可以打印出指定的字符串或变量的值。下面是几个示例:1. 打印字符串:```javaString message = "Hello, World!";Sy
2023-08-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录