C#打印相关的知识点

GDI+可以用来创建和处理图像,还可以“绘制文本”。人们通常认为,文本时打印出来的,不是绘制出来的,但是在.NET中,显示和渲染文本的技术类似于显示图形的技术:必须创建Graphics对象,然后利用该对象的方法来定位和渲染文本字符串。所以,字体(Font)是打印的基础知识,有关字体的知识请参阅MSDN  http://msdn.microsoft.com/zh-cn/library/system.drawing.font(v=vs.110).aspx 。

System.Drawing.Printing命名空间的PrintDocument类提供了控制打印进程的方法、成员属性和事件,因此,要建立输出到打印机的程序,就首先要建立PrintDocument对象。

PrintDocument pDocument = new PrintDocument();

然后调用PrintDocument.Print方法启动打印进程,此时触发PrintDocument类的BeginPrint和PrintPage事件,PrintPage事件处理方法包含生成输出的逻辑和语句,包括确定打印行数、输出DrawString语句、负责通知底层的打印控制器是否还有待打印的页面(设置HasMorePages属性)等。触发流程如下:

private void FrmMain_Load(object sender, EventArgs e)
{
sr = new StreamReader(@"数据的路径(.txt)");
//数据格式如下
/*
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
1000758,1050,SKJALDHAHDLKJAH,125.470
*/
}

加载数据

1         StreamReader sr;
2         string[] prtLine;
3         Font rptFont;
4         Font hdrFont;
5         string title = "Title";
6         float lineHeight;

类级别的变量

  private void pDocument_BeginPrint(object sender, PrintEventArgs e)
        {
            rptFont = new Font("Arial", 10);
            hdrFont = new Font(rptFont, FontStyle.Bold);
        }

BeginPrint事件,一般用于初始化字体等变量

 private void pDocument_EndPrint(object sender, PrintEventArgs e)
        {
           rptFont.Dispose();
           hdrFont.Dispose();
           sr.Close();
        }

EndPrint事件,一般用于释放资源,关闭数据连接等

 private void pDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            Graphics graphics = e.Graphics;
            int xPos = e.MarginBounds.Left;
            int lineCt = 0;
            lineHeight = hdrFont.GetHeight(graphics);
            int linesPerPage = (int)((e.MarginBounds.Bottom - e.MarginBounds.Top) / lineHeight - 2);
            float yPos = 2 * lineHeight + e.MarginBounds.Top;
            int hdrPos = e.MarginBounds.Top;
            PrintHdr(graphics, hdrPos, 200);
            string prod;
            char[] delim = { ‘,‘ };
            while ((prod = sr.ReadLine()) != null)
            {
                prtLine = prod.Split(delim, 4);
                yPos += lineHeight;
                PrintDetail(graphics, yPos);
                if (lineCt == linesPerPage)
                {
                    e.HasMorePages = true;
                    lineCt = 0;
                    break;
                }
                lineCt++;
            }
        }

PrintPages事件,包括主要的打印逻辑以及HasMorePages属性的设置

 private void PrintHdr(Graphics g, int yPos, int xPos)
        {
            g.DrawString(title, hdrFont, Brushes.Black, xPos, yPos);
            float[] ts = { 80, 80, 200 };
            StringFormat strFmt = new StringFormat();
            strFmt.SetTabStops(0, ts);
            g.DrawString("Code\tVender\tDescription\tCost", hdrFont, Brushes.Black, xPos, yPos + 2 * lineHeight, strFmt);
        }

打印大标题和列标题

 private void PrintDetail(Graphics g, float yPos)
        {
            int xPos = 200;
            StringFormat strFmt = new StringFormat();
            strFmt.Trimming = StringTrimming.EllipsisCharacter;
            strFmt.FormatFlags = StringFormatFlags.NoWrap;
            RectangleF r = new RectangleF(xPos + 160, yPos, 200, lineHeight);
            string invenid = prtLine[0];
            string vendor = prtLine[1];
            string desc = prtLine[2];
            Decimal price = decimal.Parse(prtLine[3]);
            g.DrawString(invenid, rptFont, Brushes.Black, xPos, yPos);
            g.DrawString(vendor, rptFont, Brushes.Black, xPos + 80, yPos);
            g.DrawString(desc, rptFont, Brushes.Black, r, strFmt);
            strFmt.Alignment = StringAlignment.Far;
            strFmt.Trimming = StringTrimming.None;
            g.DrawString(price.ToString("#,###.00"), rptFont, Brushes.Black, xPos + 400, yPos, strFmt);
        }

打印详细内容

 private void btnPrint_Click(object sender, EventArgs e)
        {
            PrintDocument pDocument = new PrintDocument();
            PrintDialog pDialog = new PrintDialog();
            pDialog.Document = pDocument;
            pDialog.AllowSomePages = true;

            PrintPreviewDialog preDialog = new PrintPreviewDialog();
            preDialog.Document = pDocument;
            pDocument.PrintPage += new PrintPageEventHandler(pDocument_PrintPage);
            pDocument.BeginPrint += new PrintEventHandler(pDocument_BeginPrint);
            pDocument.EndPrint += new PrintEventHandler(pDocument_EndPrint);
            if (pDialog.ShowDialog() == DialogResult.OK)
            {
                pDocument.Print();
            }
        }

按钮事件

时间: 2024-11-02 23:12:50

C#打印相关的知识点的相关文章

IO相关的知识点:输入输出控制方式

前言: 博主最近在温习操作系统原理相关的知识点,分享给那些志同道合的朋友,某些地方如果存在争议的,欢迎加Q讨论.计算机的知识实在是太多太多了,像个无底洞,不专门做学术研究,博主觉得对它的了解还是适可而止. 简介: 我们都知道计算机分为五大基本部件:运算器.控制器.存储器.输入设备和输出设备.其中,IO设备主要是由设备控制器和设备本身共同组成,其中设备控制器是集成在电路板上的一块芯片或者一组芯片,主要用于接收,识别从cpu发来的命令,并控制IO设备工作.每个控制器都有少量的用于通信的寄存器,每个寄

MFC 打印相关操作

虽说现在已经有越来越多的人转向用C#来做界面的开发,但是对于一个习惯了C++这种半面向对象语言的人来说,MFC依然是难割舍的存在.最近在做些数据库相关的事,因为是数据库,自然离不开打印报表之类的东西,所以顺带的也去研究了下如何用MFC来进行打印相关的的操作. 本篇文章参考的比较多的是这篇文章和MSDN的示例代码,另外这篇文章也提供了很多有用的参考,如果想看原文的话可以去看看. 直接用微软提供的CPrintDialog类进行打印的相关操作是非常简单的,本人将代码封装成为两个函数,除了实际往一页纸上

delphi 13 打印相关

打印 页面设置 打印预览 文档属性 //------------------------------------------------------------------------------procedure WB_Print();begin  Form1.WebBrowser1.ExecWB(OLECMDID_PRINT,1);end;//---------------------------------------------------------------------------

积累的VC编程小技巧之打印相关

1.修改打印预览的ToolBar 为AFX_IDD_PREVIEW_TOOLBAR这个ID创建一个DialogBar.则系统就会用新创建的DialogBar代替系统默认的那个 2.关于打印 1.要打印哪个视就 ((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.SetActivePane(...) //要打印的那个视对应的Pane 2.有一个单文档工程,文档窗口被切分:左视图由CTreeView 的派生类管理,右视图由CListView 的派生类CMyLi

MongoDB权威指南学习笔记4---查询相关的知识点

1 find find({查询条件},{"key":1,"email":1})  后面表示返回哪些键 2 可用的比较操作符 $lt , $lte,$gt,$gte 比如db.users.find({"age":{"$gte":18,"$lte":30}}) 3不等于 find(...{"key":{"$ne":"value"}} 4 in find

MongoDB权威指南学习笔记5---索引相关的知识点

1 查看查询计划 db.user.find({"username":"xxx"}) .explain() db.doc.find({"es_y":"2014"}).explain() {  "cursor" : "BasicCursor",  "isMultiKey" : false,  "n" : 0,  "nscannedObject

CSS3相关实用知识点

本文讲解CSS3相关实用知识点 CSS3相关实用知识点目录 边框设置 颜色设置 背景设置 渐变使用 超出文本设置 阴影设置 CSS3变换设置 过渡设置 动画设置 多列布局 BoxSizing设置 弹性布局 滤镜函数 媒体查询 resize元素 outline偏移 其他的@规则使用 边框 边框圆角 border-radius: 10px; 边框图片设置 border: 20px solid transparent; border-image: url(./2.jpg) 7 31 round; 颜色

如何提升爬虫性能相关的知识点

如何提升爬虫性能相关的知识点 爬虫的本质是伪造socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个url结束后才能继续下一个,这样我们就会发现效率非常低. 原因:爬虫是一项IO密集型任务,遇到IO问题就会阻塞,CPU运行就会停滞,直到阻塞结束.那么在CPU等待组合结束的过程中,任务其实是呈现出卡住的状态.但是,如果在单线程下进行N个任务且都是纯计算的任务的话,那么该线程对cpu的利用率仍然会很高,所以单线程下串行多个计算密集型任务

JSP 相关基础知识点

1.JSP的运行原理: JSP 本质上是一个 Servlet.每个JSP 页面在第一次被访问时, JSP 引擎将它翻译成一个 Servlet 源程序, 接着再把这个 Servlet 源程序编译成 Servlet 的 class 类文件. 然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序. 2.JSP页面一共有 9 个隐含对象. ①. request: HttpServletRequest 的一个对象. ②.