我的应用程序在Windows图元文件中绘制图表。用户需要能够以页面为中心打印图表。快速打印代码:
Private Sub PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim header As Imaging.MetafileHeader = metafile.GetMetafileHeader()
Dim sz As New SizeF(100 * header.Bounds.Width / header.DpiX, 100 * header.Bounds.Height / header.DpiY)
Dim p As New PointF((e.PageBounds.Width - sz.Width) / 2, (e.PageBounds.Height - sz.Height) / 2)
e.Graphics.DrawImage(metafile, p)
End Sub
如果我打印到PDF,这看起来很完美。但是,如果我打印到实际的打印机,它是偏离中心的,大约1/8英寸向下和向右。我做了一个快速实验,看看PageBounds的用处
e.Graphics.DrawRectangle(Pens.Red, e.PageBounds)
结果是一样的,稍微偏离中心。在PDF上,它在页面的边缘绘制一个矩形。为了它的价值,我在Toshiba e-Studio 3510c和HP LaserJet 4000上进行了测试,结果相同。任何帮助表示赞赏,这一直困扰着我好几个星期。
更新:
我最终使用了e.PageSettings.PrintableArea,但它看起来像e.Graphics.VisibleClipBounds获得与xpda的答案相同的值。
不要使用e.pagebounds作为边界框,而是尝试使用e.graphics.VisibleClipBounds。某些打印机驱动程序与e.pagebounds有点不可靠,并且可见的剪辑看起来更准确。
我认为这是打印机在页面的所有边上具有不同边距的问题。而不是相对于Bounds
定位图表,尝试使用以下属性相对于页面的真实边框定位它:
e.PageSettings.PaperSize.Width
e.PageSettings.PaperSize.Height
pdf可能不会出现问题,因为您可以在页面的整个区域上打印(即Bounds.Width
和Bounds.Height
= 0,这与使用PaperSize
属性相同)。
代码如下:
Private Sub PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim header As Imaging.MetafileHeader = metafile.GetMetafileHeader()
Dim sz As New SizeF(100 * header.Bounds.Width / header.DpiX, 100 * header.Bounds.Height / header.DpiY)
Dim LeftMargin, TopMargin As Single
LeftMargin = ((e.Graphics.VisibleClipBounds.Width - sz.width) / 2) + (e.Graphics.VisibleClipBounds.Left / 2)
TopMargin = ((e.Graphics.VisibleClipBounds.Height- sz.Height) / 2) + (e.Graphics.VisibleClipBounds.Top/ 2)
e.Graphics.DrawImage(metafile, LeftMargin , TopMargin, sz )
End Sub