.Net(c#)打印--多页打印

如果要实现多页打印,就要使用PrintPageEventArgs类的HasMorePages属性。

我们对之前的代码作如下变更:
     增加PrintDocument的BeginPrint和EndPrint事件。 BeginPrint事件用于得到被打印的内容。 EndPrint用于释放资源。 PrintDocument的PrintPage事件中实现分页。
     基中:BeginPrint的事件方法在PrintPage事件方法前被呼叫。
            PintPage的事件方法在EndPrintPage事件方法前被呼叫。
            EndPrint事件方法最后被呼叫,EndPrint事件方法结束后会回到PrintDocument.Print()方法中,执行打印。

其过程如下:
     1、实例化打印文档
     2、订阅事件(订阅BeginPrint事件,用于得到被打印的内容;PinrtPage事件,用于绘制各个页内容; EndPrint事件,用于释放资源)
     3、调用BeginPrint事件的方法,得到打印内容
     4、调用PinrtPage事件的方法,绘制多个打印页面,并根据判断,设置是否进行多页打印
     5、调用EndPrint事件的方法,释放资源,完成后开始打印

代码如下:

using System.IO;
using System.Drawing.Printing;

namespace SimpleEditor
{
     public partial class SimpleEditorForm : Form
     {
         private string filename = "Untitled";

//1、实例化打印文档
         PrintDocument pdDocument = new PrintDocument();

private string[] lines;
         private int linesPrinted;
         public SimpleEditorForm()
         {
             InitializeComponent();

//2、订阅事件

//订阅PinrtPage事件,用于绘制各个页内容
             pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);
             //订阅BeginPrint事件,用于得到被打印的内容
             pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);
             //订阅EndPrint事件,用于释放资源
             pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);
         }

private void OnFilePrint(object sender, EventArgs e)
         {
             try
             {
                 //调用打印
                 pdDocument.Print();

/*
                  * PrintDocument对象的Print()方法在PrintController类的帮助下,执行PrintPage事件。
                  */
             }
             catch (InvalidPrinterException ex )
             {
                 MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 throw;
             }
         }

/// <summary>
         /// 3、得到打印内容
         ///每个打印任务只调用OnBeginPrint()一次。
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         void pdDocument_BeginPrint(object sender, PrintEventArgs e)
         {
             char[] param ={ ‘\n‘ };
             lines = textBoxEdit.Text.Split(param);

int i = 0;
             char[] trimParam ={ ‘\r‘ };
             foreach (string s in lines)
             {
                 lines[i++] = s.TrimEnd(trimParam);
             }
         }

/// <summary>
         /// 4、绘制多个打印页面
         /// printDocument的PrintPage事件
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void OnPrintPage(object sender, PrintPageEventArgs e)
         {
             /*
              *得到TextBox中每行的字符串数组
              * \n换行
              * \r回车
              */

int x = 20;
             int y = 20;
             while (linesPrinted<lines.Length)
             {
                 //绘制要打印的页面
                 e.Graphics.DrawString(lines[linesPrinted++], new Font("Arial", 10), Brushes.Black, x, y);

y += 55;

//判断超过一页时,允许进行多页打印
                 if (y >= e.PageBounds.Height - 80)
                 {
                     //允许多页打印
                     e.HasMorePages = true;

/*
                      * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次调用OnPrintPage()方法,打印一个页面。
                      * PrintLoopI()有一个用于每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
                      */
                     return;
                 }
             }

linesPrinted = 0;
             //绘制完成后,关闭多页打印功能
             e.HasMorePages = false;

}

/// <summary>
         ///5、EndPrint事件,释放资源
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         void pdDocument_EndPrint(object sender, PrintEventArgs e)
         {
            //变量Lines占用和引用的字符串数组,现在释放
             lines = null;
         }
     }
}这样就完成了多页打印功能。

PageSetupDialog:
     可以配置页面大小和纸张来源、方向、页边距,因为这些选项都依赖于打印机,所以在这个对话框中也可以选择打印机。

AllowPager

AllowOrientation

PageSettings.Landscape

AllowPrinter

PageSettings.Margins

MinMagins

AllowMargins

PageSettings.PaperSource

PageSettings.PaperSize

它有一些属性如下图:

说明:

1、页面
     AllowPaper:是否可选择页面大小和纸张来源。
     PageSetupDialog.PageSetting.PaperSize属性返回一个PaperSize实例,用它的属性Height、Width和PaperName可以读取高度、宽度和纸张名称。
     PaperName指定诸如Letter和A4等名称。
     Kind属性返回一个枚举,从中可获取PaperKind枚举的一个值,PaperKind枚举包含许多不同的纸张大小,例如A3、A4、A5、Letter、LetterPlus和LetterRotated。
     PageSetupDiaog.PageSettings.PaperSource属性返回一个PaperSource实例,其中可以读取打印机纸张来源和相应的纸张类型(只要打印机用该打印机设置进行了正确的配置)。

2、页边距
     AllowMargins属性允许用户设置打印输出的页边距值。
     MinMargins可以为用户定义输入的最小页边距值.
     PageSetupDialog.PageSettings.Margins读取页边距,值有Bottom,Left,Right和Top属性。

3、方向
     AllowOrientation属性定义用户是否可以选择纵向和横向打印方式。
     PageSetupDialog.PageSettings.Landscape值可以读取选定的值。横向为True,纵向为False

4、打印机
AllowPrinter属性指定用户是否可选择打印机。

PageSetupDialog的用法

使用PageSetupDialog的方法比较简单,只需
     1、在实例化一个PageSetupDialog
     2、设置document属性设置为需要打印的文档
     3、呼叫ShowDialog()方法,打开版面设置

时间: 2024-10-05 04:19:38

.Net(c#)打印--多页打印的相关文章

关于JavaScript打印去掉页眉页脚

因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root,hkey_path,hkey_key; hkey_root="HKEY_CURRENT_USER"; hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\"; // 设置网页打印的页眉页脚为空

LODOP 使用 和分页 加上每一页打印多少份

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="Scripts/LodopFunc

[办公应用]如何打印较小边距的PPT讲义(或者每页打印16页)

关键词:打印 PPT 讲义 4张 边距 今天同事问我如何打印PowerPoint的讲义.她自己使用PowerPoint打印讲义,设置每页4张,但是页边距太大:觉得浪费很大. 经过网上查阅后,现将方法抄录如下:(注意不是所有的打印机都支持) 1.打印内容处,不要选择“讲义”.选择幻灯片,然后单击属性. 2.在各种打印机中找到设置每页纸张打印多少页面数的位置: HP 2300打印机,找到如下设置: HP 5000打印机如下: [如何打印多页] 看到那个 每页打印16页的选项了吗?o(∩_∩)o… [

javascript打印设置页眉页脚

<script language="JavaScript"> var hkey_root,hkey_path,hkey_key hkey_root="HKEY_CURRENT_USER" hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\" //设置网页打印的页眉页脚为空 function pagesetup_null(){ try{ var RegWsh

IE浏览器打印的页眉页脚设置解决方法

首先说明问题:默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚. 下面先说明&w&bPage&p of &P , &u&b&d的含义 &w - 窗口标题 &u - 页面地址 &d - 短日期格式,如10/12/2006 &D - 长日期格式,如Tursday, October 12, 2006 &t - 12小时制时间 &T - 24小时制时间

优化数据页面(25)——每页打印标题行

优化数据页面(25)--每页打印标题行 设计要点:优化数据页面.界面设计.美化exce 阿金:说了半天的优化,都是针对显示的.其实还有一大块需要优化,那就是--打印页面. 秀秀:嗯.说得对. 阿金:光说"对"有什么用啊,给点具体的! 秀秀:别着急呀,俺正要说!最常用的就是,当数据量超出一页时,每页要重复标题行! 阿金:嗯,这还说到了点儿上! 秀秀:嚯!夸别人也是这种口气! 阿金:噢噢噢,习惯了,俺改. 秀秀:哼!本性难移! 版权声明:本文为博主原创文章,未经博主允许不得转载.

C# 打印多页tif

注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFrame(FrameDimension.Page, m_CurrentPage); 3.设置PrintPage时间PrintPageEventArgs参数值,判断是否有额外页打印(次数是打印多页关键) e.HasMorePages = (m_CurrentPage < m_PageCount); 基本

博思得条码打印机打印空白页处理方法

今天遇到一个奇怪的事情,公司一台 博思得(C168 300S)的条码打印出现下面的情况: 1.打印测试页>>>>>空白 2.打印机打印自检页>>>>正常 3.打印机驱动>>>>>正常 4.打印机连接端口>>>>>正常 而且打印测试页时: 第一次打印时打印机只是滚动出一个空白的页 第二次打印时,打印机只是中间的灯闪了一下,就没有反应,纸也不会滚动. 处理方法: 咨询厂家客服(厂家客服的效率真的是

Excel2010表格里设置每页打印时都有表头

在打印Excel表格时常常会出现如果存在多页打印时,往往从第二页开始就会出现没有表头的情况,导致到后面都不清楚对应的是哪个数据,查看时也很麻烦,下面就将为大家介绍如何在Excel表格里设置每页打印时都有表头 1. 首先打开所要修改的Excel表格 2. 我们首先来看看第一页与第二页的区别 3. 打开菜单栏里面的"页面布局"选项卡 4. 点击页面设置板块中的"打印标题" 5. 在打印标题内有顶端标题行与左端标题行,选中顶端标题行,点击右边的小箭头 6. 点击小箭头后会