为什么我不能将图像居中在页面上以便在VB.NET中打印?

问题描述 投票:1回答:3

我的应用程序在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的答案相同的值。

vb.net printing
3个回答
2
投票

不要使用e.pagebounds作为边界框,而是尝试使用e.graphics.VisibleClipBounds。某些打印机驱动程序与e.pagebounds有点不可靠,并且可见的剪辑看起来更准确。


0
投票

我认为这是打印机在页面的所有边上具有不同边距的问题。而不是相对于Bounds定位图表,尝试使用以下属性相对于页面的真实边框定位它:

e.PageSettings.PaperSize.Width
e.PageSettings.PaperSize.Height

pdf可能不会出现问题,因为您可以在页面的整个区域上打印(即Bounds.WidthBounds.Height = 0,这与使用PaperSize属性相同)。


0
投票

代码如下:

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
© www.soinside.com 2019 - 2024. All rights reserved.