如果要实现多页打印,就要使用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()方法,打开版面设置

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

  1. 【转】C#使用PrintDocument打印 多页 打印预览

    PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...

  2. C#使用PrintDocument打印 多页 打印预览

    PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...

  3. 关于JavaScript打印去掉页眉页脚

    因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root, ...

  4. 两页pdf打印为一页,并且放大(打印英文pdf常用)

    多很英文书籍都是小书,若我们直接打印它的pdf会很厚,比如我要打印一本 thinking in C++,就要800+页.不如把两页打成一页.但是打成一页之后又太小了,需要放大.具体方法如下:   前提 ...

  5. C# 打印多页tif

    注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFr ...

  6. QuickReport多页打印

    You use composite reports for this(TQrCompositeReport) on the quickreports tabTake a look in the Dem ...

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

    首先说明问题: 默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚 下面先说明&w&bPage&p of &P ...

  8. LODOP批量打印多页模版进行维护

    批量打印的时候,可以循环多任务,也可以循环多页,很多的时候也可以分页分任务,分组打印.如果是一个任务里的多页相同的模版,一个任务中会有很多打印项,这些打印项在每页中的位置是相同的,如果要调整,调整结果 ...

  9. Excel设置excel打印每页都有表头标题

    Excel设置excel打印每页都有表头标题

随机推荐

  1. Android-语言国际化

    Android-语言国际化 参考 http://www.loc.gov/standards/iso639-2/php/code_list.php 各国语言表 Overview Internationa ...

  2. Android中加载事件的方式

    Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...

  3. Xamarin iOS教程之使用按钮接接收用户输入

    Xamarin iOS教程之使用按钮接接收用户输入 Xamarin iOS使用按钮接接收用户输入 按钮是用户交互的最基础控件.即使是在iPhone或者iPad中,用户使用最多操作也是通过触摸实现点击. ...

  4. [BZOJ3585]mex(莫队+分块)

    显然可以离线主席树,这里用莫队+分块做.分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补. 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每 ...

  5. android 获取系统默认路径

    Environment.getDataDirectory().getPath() : /dataEnvironment.getDownloadCacheDirectory().getPath()  : ...

  6. 闲话函数式变成与OOP

    函数式编程扫盲篇 推薦參考文獻地址:http://byvoid.github.io/slides/apio-fp/index.html 1. 概论 在过去的近十年的时间里,面向对象编程大行其道.以至于 ...

  7. HDU 4763 Theme Section (2013长春网络赛1005,KMP)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  8. jQuery自己定义绑定的魔法升级版

    jQuery自己定义绑定 首先让我们来看看jQuery的自己定义绑定的用法,你能够使用bind或者live来订阅一个事件(当然1.7以后也能够使用on了),代码例如以下: $("#myEle ...

  9. STM32 microcontroller system memory boot mode

    The bootloader is stored in the internal boot ROM memory (system memory) of STM32 devices. It is pro ...

  10. CRC32 Source Code

    /* The Quest Operating System * Copyright (C) 2005-2010 Richard West, Boston University * * This pro ...