请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 5638|回复: 6

winForm和WPF通用打印类,只需要将数据重新处理传递即可

  [复制链接]
  • TA的每日心情
    开心
    2018-3-8 11:10
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    11

    主题

    91

    帖子

    749

    积分

    高级会员

    Rank: 4

    积分
    749
    发表于 2014-10-15 15:50:22 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    [C#] 纯文本查看 复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Media;
    using System.Drawing.Printing;
    using System.Windows;
    using System.Windows.Forms;
    using System.Windows.Input;
    using System.Windows.Markup;
    using System.IO;
    using System.Collections;
    using System.Drawing.Design;
    using System.Drawing;
    using System.Management;
    
    namespace Bll.Printer_Bll
    {
        public class PrintManager
        {
            /// <summary>
            /// 构造接受txt完整数据的字符数组
            /// </summary>
            public string[] TxtString;
    
            /// <summary>
            /// 实例化打印文档
            /// </summary>
            PrintDocument printTxt = new PrintDocument();
    
            /// <summary>
            /// 打印页的纸张大小
            /// </summary>
            public string PaperSize;
    
            /// <summary>
            /// 打印的纸张来源
            /// </summary>
            public string PaperSource;
    
            /// <summary>
            /// 打印的方向,纵向,横向
            /// </summary>
            public bool Landscape = false;
    
            /// <summary>
            /// 设置的打印机的名称
            /// </summary>
            public string PrinterName;
    
            /*与页面的编辑,左,右,上,下*/
            public int MarginLeft = 0;
            public int MarginRight = 0;
            public int MarginTop = 0;
            public int MarginBottom = 0;
    
            public PrintManager(string TxtPath) 
            {
                //将txt文档的数据加载出来
                this.TxtString = ReadTxtDocument(TxtPath);
                this.PrinterName = "GP-58N Series";
                this.PaperSize = "Gprinter 58(48) x 210 mm";
                this.PaperSource = "自动选择";
    
                TxtDocumentPrint();
            }
    
            /// <summary>
            /// 调用win api将指定名称的打印机设置为默认打印机
            /// </summary>
            class Externs
            {
                [System.Runtime.InteropServices.DllImport("winspool.drv")]
    
                //调用win api将指定名称的打印机设置为默认打印机
                public static extern bool SetDefaultPrinter(String Name); 
            }
            /// <summary>
            /// 文档txt打印方法
            /// </summary>
            public void TxtDocumentPrint() 
            {
                //设置打印机为默认
                if (Externs.SetDefaultPrinter(PrinterName) == true)
                {
                    //初始化两个打印参数
                    System.Drawing.Printing.PaperSize PrintPaperSize = null;
                    System.Drawing.Printing.PaperSource PrintPaperSource = null;
    
                    //获取打印机支持的纸张种类集合
                    PrinterSettings.PaperSizeCollection PaperSizes = printTxt.PrinterSettings.PaperSizes;
    
                    //获取打印机的进纸类型集合
                    PrinterSettings.PaperSourceCollection PaperSources = printTxt.PrinterSettings.PaperSources;
    
                    //遍历纸张种类集合,根据输入设置,选择纸张类型
                    for (int i = 0; i < PaperSizes.Count; i++)
                    {
                        //匹配成功,将当前纸张类型设置为打印纸张
                        if (PaperSize == PaperSizes[i].PaperName)
                        {
                            PrintPaperSize = PaperSizes[i];
                            break;
                        }
                    }
    
                    //遍历进纸类型,根据输入设置,选择进纸类型
                    for (int j = 0; j < PaperSources.Count; j++)
                    {
                        //匹配成功,将当前进纸类型设置为进纸类型
                        if (PaperSource == PaperSources[j].SourceName)
                        {
                            PrintPaperSource = PaperSources[j];
                            break;
                        }
                    }
    
                    if (PrintPaperSize != null && PrintPaperSource != null)
                    {
                        //设置打印页面
                        PrintSettings(printTxt, PrintPaperSize, PrintPaperSource, true, PrinterName, 10, 10, 10, 10);
    
                        //绘制打印页面
                        printTxt.PrintPage += new PrintPageEventHandler(DrawImage);
    
                        //打印
                        printTxt.Print();
                    }
                }
            }
    
            /// <summary>
            /// 读取txt文件,将文件转为string[]对象类型集合
            /// </summary>
            /// <param name="TxtPath">txt文件的路径</param>
            /// <returns>转换完成的string[]</returns>
            public string[] ReadTxtDocument(string TxtPath) 
            {
                try
                {
                    //创建txt文档读取对象和数据存储List对象
                    StreamReader ReadTxt = new StreamReader(TxtPath, System.Text.Encoding.Default);
                    System.Collections.ArrayList TxtData = new System.Collections.ArrayList();
    
                    //循环读取txt文档的所有内容
                    //使用arraylist的目的是读取完整的txt文档
                    while (ReadTxt.Peek() != -1)
                    {
                        TxtData.Add(ReadTxt.ReadLine());
                    }
    
                    //将ArrayList对象转为string[]对象
                    string[] TempString = (string[])(TxtData.ToArray(typeof(string)));
    
                    //关闭读取对象,清空缓冲区
                    ReadTxt.Close();
    
                    return TempString;
                }
                catch (Exception)
                {
                    throw;
                }
            }
    
            /// <summary>
            /// 对调取的打印机进行文档的打印设置
            /// </summary>
            /// <param name="printTxt">需要打印的文档</param>
            /// <param name="PaperName">打印的页面的纸张大小,eg:A4</param>
            /// <param name="SourceName">设置打印文档的纸张来源,eg:上层纸盒</param>
            /// <param name="Landscape">设置打印文档的打印方向,eg:纵向</param>
            /// <param name="PrinterName">设置需要打印该文档的打印机</param>
            /// <param name="MarginLeft">打印页左边距,单位:英寸</param>
            /// <param name="MarginRight">打印页右边距,单位:英寸</param>
            /// <param name="MarginTop">打印页顶部边距,单位:英寸</param>
            /// <param name="MarginBottom">打印页底部边距,单位:英寸</param>
            public void PrintSettings(PrintDocument printTxt, PaperSize PaperName, PaperSource SourceName, bool Landscape, string PrinterName, int MarginLeft, int MarginRight, int MarginTop, int MarginBottom) 
            {
                //设置打印的页面的纸张大小
                //eg:A4
                printTxt.DefaultPageSettings.PaperSize = PaperName;
    
                //设置打印文档的纸张来源
                // eg:上层纸盒
                printTxt.DefaultPageSettings.PaperSource = SourceName;
    
                //设置打印文档的打印方向
                // eg:纵向
                printTxt.DefaultPageSettings.Landscape = Landscape;
    
                //设置需要打印的打印机的名称
                printTxt.PrinterSettings.PrinterName = PrinterName;
    
                //设置打印文档的页边距
                printTxt.DefaultPageSettings.Margins = new Margins(MarginLeft, MarginRight, MarginTop, MarginBottom);
            }
    
            /// <summary>
            /// 将txt文档的数据draw到画布上
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="PaintData"></param>
            public void DrawImage(object sender,PrintPageEventArgs PaintData) 
            {
                string[] TempString = TxtString;
                for (int i = 0; i < TempString.Length; i++)
                {
                    string drawString = TempString[i];
                    // Create font and brush.
                    Font drawFont = new Font("Arial", 16);
                    SolidBrush drawBrush = new SolidBrush(Color.Black);
    
                    // Create rectangle for drawing.
                    float x = 150.0F;
                    float y = 150.0F;
                    float width = 200.0F;
                    float height = 50.0F;
                    RectangleF drawRect = new RectangleF(x, y, width, height);
    
                    // Draw rectangle to screen.
                    Pen blackPen = new Pen(Color.Black);
                    PaintData.Graphics.DrawRectangle(blackPen, x, y, width, height);
    
                    // Set format of string.
                    StringFormat drawFormat = new StringFormat();
                    drawFormat.Alignment = StringAlignment.Center;
    
                    // Draw string to screen.
                    PaintData.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect, drawFormat);
                }
    
                
            }
        }
    
    }

    该用户从未签到

    0

    主题

    3

    帖子

    40

    积分

    新手上路

    Rank: 1

    积分
    40
    发表于 2014-10-15 16:04:07 | 显示全部楼层
    飞P,你总是那么的有魅力!

    点评

    你大爷的二条  详情 回复 发表于 2014-10-15 16:08
  • TA的每日心情
    开心
    2018-3-8 11:10
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    11

    主题

    91

    帖子

    749

    积分

    高级会员

    Rank: 4

    积分
    749
     楼主| 发表于 2014-10-15 16:08:35 | 显示全部楼层
    ≮转折┱徘徊 发表于 2014-10-15 16:04
    飞P,你总是那么的有魅力!

    你大爷的二条
  • TA的每日心情
    开心
    前天 19:06
  • 签到天数: 1469 天

    [LV.10]以坛为家III

    1177

    主题

    3082

    帖子

    9万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    94058

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2014-10-15 16:34:06 | 显示全部楼层
    - -   跟1楼认识啊?

    点评

    认识  详情 回复 发表于 2014-10-16 09:19
    C#论坛 www.ibcibc.com IBC编程社区
    C#
    C#论坛
    IBC编程社区
  • TA的每日心情
    开心
    2018-3-8 11:10
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    11

    主题

    91

    帖子

    749

    积分

    高级会员

    Rank: 4

    积分
    749
     楼主| 发表于 2014-10-16 09:19:26 | 显示全部楼层
    ibcadmin 发表于 2014-10-15 16:34
    - -   跟1楼认识啊?

    认识
  • TA的每日心情
    开心
    前天 19:06
  • 签到天数: 1469 天

    [LV.10]以坛为家III

    1177

    主题

    3082

    帖子

    9万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    94058

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2014-10-16 13:46:11 | 显示全部楼层

    那好啊  多拉点人来IBC
    C#论坛 www.ibcibc.com IBC编程社区
    C#
    C#论坛
    IBC编程社区
  • TA的每日心情
    开心
    2014-9-22 14:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    14

    帖子

    45

    积分

    新手上路

    Rank: 1

    积分
    45
    发表于 2014-12-24 14:08:14 | 显示全部楼层
    哈哈哈
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则