在实际中,我们经常需要将文档中的多页内容同时打印在一张纸上,有的打印机支持这种打印方式,并可以通过调整打印机的设置来完成。不过这种方法依赖于特殊的打印机类型,开发人员并不能干预这个打印过程。
本文中的例子主要演示如何利用TX TextControl控件,实现将文档中的多页内容同时打印到一张纸上。
首先,TX TextControl的也渲染引擎将文档中的每一页进行单独的渲染,并将每一页的渲染结果存放到一个Metafile类型的数组中,代码如下:
// create a metafile array of all TX Text Control pages mfPageImages = new Metafile[textControl1.Pages]; int iCounter = 0; foreach (TXTextControl.Page page in textControl1.GetPages()) { mfPageImages.SetValue(page.GetImage(TXTextControl.Page.PageContent.All), iCounter); iCounter++; } 复制代码
然后创建一个PrintDocument的实例,并添加相应的事件:
// create a new print document that is manipulated in the PrintPage event PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEventHandler(pd_PrintPage); pd.QueryPageSettings += new QueryPageSettingsEventHandler(pd_QueryPageSettings); pd.BeginPrint += new PrintEventHandler(pd_BeginPrint); 复制代码
在PrintPage事件中,文档中的4页内容将会被打印到纸张上的不同位置,每页内容的缩放比例根据实际页面宽度和页边距计算出来的:
// calculate the scale factor based on the current paper size iThumbWidth = (int)(((e.PageSettings.PaperSize.Width - iPageMargin) * fDpi) / 2); dScaleFactor = ((float)(iThumbWidth) / (float)(mfPageImages[0].Size.Width)); 复制代码
通过这种方法的好处在于,所有的画操作并不需要进行手动调整缩放比例,下面代码展示了如何绘制元文件:
// draw the metafile g.DrawImage(mfPageImages[iPrintPageCounter], 0F, 0F, sfImageSize.Width, sfImageSize.Height); 复制代码
接下来,将通过TranslateTransform方法来改变下一页绘制的横纵起始坐标:
-
// transform the matrix to move the next page switch (i) { // upper right case 0: g.TranslateTransform(sfImageSize.Width, 0); break; // lower left case 1: g.TranslateTransform(-sfImageSize.Width, sfImageSize.Height); break; // lower right case 2: g.TranslateTransform(sfImageSize.Width, 0); break; } 复制代码
源码下载:VS2010 + TX TextControl 17.0