.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()方法,打开版面设置

.Net(c#)打印--多页打印的更多相关文章
- 【转】C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- 关于JavaScript打印去掉页眉页脚
因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root, ...
- 两页pdf打印为一页,并且放大(打印英文pdf常用)
多很英文书籍都是小书,若我们直接打印它的pdf会很厚,比如我要打印一本 thinking in C++,就要800+页.不如把两页打成一页.但是打成一页之后又太小了,需要放大.具体方法如下: 前提 ...
- C# 打印多页tif
注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFr ...
- QuickReport多页打印
You use composite reports for this(TQrCompositeReport) on the quickreports tabTake a look in the Dem ...
- IE浏览器打印的页眉页脚设置解决方法
首先说明问题: 默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚 下面先说明&w&bPage&p of &P ...
- LODOP批量打印多页模版进行维护
批量打印的时候,可以循环多任务,也可以循环多页,很多的时候也可以分页分任务,分组打印.如果是一个任务里的多页相同的模版,一个任务中会有很多打印项,这些打印项在每页中的位置是相同的,如果要调整,调整结果 ...
- Excel设置excel打印每页都有表头标题
Excel设置excel打印每页都有表头标题
随机推荐
- normalizr实践使用(个人总结,仅供参考)
# normalizr实践使用 原数据 (自编数据,本数据仅供参考) var aaaObj ={ "id" : "0000000000000000000000000000 ...
- JDBC之 连接池
JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...
- HDU.5181.numbers(DP)
题目链接 参考. \(Description\) 将\(1,2,\cdots,n(n\leq 300)\)依次入栈/出栈,并满足\(m(m\leq 90000)\)个形如\(x\)要在\(y\)之前出 ...
- hdu 4442 37届金华赛区 A题
题意:给出一些队伍,每个队伍有初始等待时间和每秒增加的时间,求最短时间 假设有两个队初始时间和每秒增加时间为a1,b1和a2,b2 若第选择第一个的时间小于第二个,则 a1+a2+a1*b2<a ...
- 【转载】vc编译exe的体积最小优化
原文地址:http://www.2cto.com/kf/200908/40970.html vc通过设置参数来自定义编译方式.主要用到的技巧有: 一,使用release版而不用debug版编译 使用d ...
- 群晖NAS简介(转)
Synology 群晖科技(Synology )创立于 2000 年,自始便专注于打造高效能.可靠.功能丰富且绿色环保的 NAS 服务器,是全球少数几家以单纯的提供网络存储解决方案获得世界认同的华人企 ...
- nginx php-fpm安装配置(转)
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管 ...
- USB组合设备 Interface Association Descriptor (IAD)
Communication Device Class,简称CDCUSB Compound Device,USB复合设备USB Composite Device,USB组合设备 摘要USB复合设备 Co ...
- W3wp.exe占用CPU及内存资源
问题背景 最近使用一款系统,但是经常出现卡顿或者用户账号登录不了系统.后来将问题定位在了服务器中的“w3wp.exe”这个进程.在我们的用户对系统进行查询.修改等操作后,该进程占用大量的CPU以及内存 ...
- 使用SIGALRM信号为阻塞操作设置超时
我们经常会遇到为阻塞操作设置超时的问题,比如说阻塞套接字read读取设置10秒超时,其中一个办法就是调用alarm函数,它在指定超时时期产生SIGALRM信号,使得阻塞操作中断. 但其弊端在于: 1. ...