iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c# 如何实现web打印插件
  • 868
分享到

c# 如何实现web打印插件

2024-04-02 19:04:59 868人浏览 八月长安
摘要

目录客户端程序(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打印插件的资料请关注编程网其它相关文章!

--结束END--

本文标题: c# 如何实现web打印插件

本文链接: https://www.lsjlt.com/news/128251.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • c# 如何实现web打印插件
    目录客户端程序(Winform)1、监听Web端的WebSocket消息,这里有用到三方包:Fleck,开箱即用,非常方便。2、处理Html,将Html转换为图片:3、打印图片其他的...
    99+
    2022-11-12
  • 如何浅析C#打印和C#打印预览的实现
    如何浅析C#打印和C#打印预览的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们谈到C#打印和C#打印预览的实现其中主要就是包括:页面设置、打印预览、打印...
    99+
    2023-06-17
  • Vue集成lodop插件实现打印功能
    目录VUE简单使用lodop1.创建LodopFuncs.js文件2.在打印功能vue页面引入LodopFuncs3.执行打印方法4.打印接口函数官网样例说明5.完整页面示例VUE ...
    99+
    2023-01-30
    Vue lodop打印功能 Vue lodop打印 Vue lodop打印 Vue 打印
  • Vue怎么用插件实现打印功能
    这篇文章主要介绍“Vue怎么用插件实现打印功能”,在日常操作中,相信很多人在Vue怎么用插件实现打印功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么用插件实现打印功能”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • 如何在web前端里实现打字机插件
    这篇文章主要介绍了如何在web前端里实现打字机插件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何在web前端里实现打字机插件文章都会有所收获,下面我们一起来看看吧。最简单的打字机const dom = do...
    99+
    2023-07-05
  • vue打印插件vue-print-nb的实现代码
    1.引入插件npm install vue-print-nb --save 在main.js中引入 import Print from 'vue-print-nb'Vue.use(P...
    99+
    2022-11-13
  • Vue中使用Printjs插件实现打印功能
    目录前言一、Print.js介绍二、安装/引入方法1.下载print.js方法2.使用npm安装print插件三、使用-“html”类型四、其他Type示例总...
    99+
    2022-11-13
    Vue Printjs打印插件 vue打印插件
  • C#中如何使用打印控件
    C#中如何使用打印控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先弄一个printDocument控件,然后在打印的按钮中直接调用printDocument1.print...
    99+
    2023-06-17
  • C++如何实现二维图形的打印
    这篇文章主要介绍了C++如何实现二维图形的打印,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、下三角图形的打印#include<iostream>using&n...
    99+
    2023-06-29
  • php如何实现Web页面的打印功能
    这篇文章主要讲解了“php如何实现Web页面的打印功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现Web页面的打印功能”吧!下面,我们先简单介绍一下能够实现打印功能的基本知识...
    99+
    2023-07-05
  • JQuery如何实现文本框水印插件
    这篇文章主要为大家展示了“JQuery如何实现文本框水印插件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JQuery如何实现文本框水印插件”这篇文章吧。 J...
    99+
    2022-10-19
  • C语言如何实现打印杨辉三角
    这篇文章给大家分享的是有关C语言如何实现打印杨辉三角的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。题目描述打印杨辉三角(前N行)问题分析杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在...
    99+
    2023-06-22
  • java如何实现打印机的打印功能
    要实现打印机的打印功能,可以使用Java中的打印机相关的API。以下是一个简单的示例代码:```javaimport javax.p...
    99+
    2023-09-01
    java
  • mybatis 插件: 打印 sql 及其执行时间实现方法
    Plugins摘一段来自MyBatis官方文档的文字。MyBatis允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis允许使用插件来拦截方法调用:Executor(update、query、flushStateme...
    99+
    2023-05-31
    mybatis 打印 执行sql
  • Vue利用插件实现打印功能的示例详解
    目录安装 引入 使用 这里介绍一个插件(vue-print-nb),蛮好用的,用起来很方便,所以想记录一下  npm官方: https://w...
    99+
    2023-03-19
    Vue实现打印功能 Vue打印功能 Vue打印
  • C#如何实现插件构架
    这篇文章主要讲解了“C#如何实现插件构架”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现插件构架”吧!假设你设计的程序已经部署到用户的计算机上,并且能够正常运行了。但是有一天,用户...
    99+
    2023-06-17
  • JS中如何实现打印
    小编给大家分享一下JS中如何实现打印,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JS实现打印两方法要实现点击“打印”按钮以后就将页面打印出来JS中一般有两种方法。1.用Object实现打...
    99+
    2022-10-19
  • XP系统下打印机如何实现双面打印
    现在的打印机基本上都拥有双面打印的功能,但一般情况下都是默认打印单面的。既然拥有双面打印的功能,我们就要物尽其所。这里以WinXP系统为例,介绍操作方法。   XP系统打印机不可双面打印怎么办   1、点击屏幕左 ...
    99+
    2023-06-13
    打印机 双面打印 系统 XP
  • C++详解如何实现两个线程交替打印
    C++线程库,点击此处查看文档 首先简单搭一个框架,让两个线程先尝试实现交替打印。 //实现两个线程交替打印 #include <iostream> #include &...
    99+
    2022-11-13
  • 如何进行C#打印设置实现源码的分析
    本篇文章为大家展示了如何进行C#打印设置实现源码的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#打印设置是如何在实际编程开发中体现的呢?C#打印设置需要注意什么呢?C#打印设置常用属性是如何...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作