你可能已经注意到了在调用LocalReport的Render方法时用到了一个XML格式的DeviceInfo结构,在SQL Server 2005 Report Services中,DeviceInfo结构是为了给特定的呈现格式传递参数。来看一个简单的DeviceInfo结构:
这个简单的DeviceInfo结构至少为LocalReport的Render方法指定了输出格式、页宽、页高、左边距、右边距、下边距信息,在我们使用PrintPage的方法将LocalReport呈现为EMF图片时,EMF图片在页面上显示的大小、边距就是由这个DeviceInfo结构来决定的,如果为DeviceInfo结构和PrintDocumnt设置不匹配的页面大小或边距,那么在PrintPage事件中使用DrawImage方法画出的图片将出现放大或缩小的情况,这是我们不愿意看到的结果。也就是说,在使用自定义纸张进行单据打印时,我们不仅要为PrintDocument设置页面大小和边距,还要为LocalReport设置与PrintDocument相同的页面大小和边距。关于DeviceInfo的结构,可以参考http://msdn2.microsoft.com/zh-cn/library/ms155373.aspx
下面是我封装的一个为生成DeviceInfo结构使用的类:
好了,解决了DeviceInfo,现在来看一下如何在PrintDocument的PrintPage事件中向打印机输出由LocalReport呈现的EMF图片。使用的方法基本上就是在GotReportViewer的例程Print a report from a console app中使用的方法,但是需要指出的一点是例程中使用事件参数System.Drawing.Printing.PrintPageEventArgs类的Graphics属性的DrawImage方法向打印机输出EMF图片,在实际的应用中,发现DrawImage方法绘出的图片会出现放大或缩小的情况,即使为DrawImage方法指定了看起来正确的参数ev.Graphics.DrawImageUnscaledAndClipped(this.m_PageImage, ev.PageBounds);,我使用的方法是DrawImageUnscaledAndClipped,在为DeviceInfo结构和PrintDocument指定好适当且匹配的页面设置时,输出的结果是比较好的。
待续……