Vb.net 利差界限扩大,;PrintDocument.Print()中的高度高于PrintPreviewDialog.ShowDialog()中的高度

Vb.net 利差界限扩大,;PrintDocument.Print()中的高度高于PrintPreviewDialog.ShowDialog()中的高度,vb.net,printing,margin,Vb.net,Printing,Margin,PrintPreviewDialog的显示非常完美,如果我使用了PrintDocument.Print()并使用类似PDF995的虚拟打印机,它也非常完美。但是,如果我选择了PrintDocument.Print(),并选择了一台物理打印机(是的,我尝试了多台打印机),则框的左上角放置正确,而不是右下角。右下角距离纸张右侧5.5毫米,距离底部7毫米 我画了一个视觉辅助图来进一步说明发生了什么。红色框是我所期望的,当我使用PrintPreviewDialg或打印到虚拟打印机时会发生什么。蓝色框是我

PrintPreviewDialog
的显示非常完美,如果我使用了
PrintDocument.Print()
并使用类似PDF995的虚拟打印机,它也非常完美。但是,如果我选择了
PrintDocument.Print()
,并选择了一台物理打印机(是的,我尝试了多台打印机),则框的左上角放置正确,而不是右下角。右下角距离纸张右侧5.5毫米,距离底部7毫米

我画了一个视觉辅助图来进一步说明发生了什么。红色框是我所期望的,当我使用
PrintPreviewDialg
或打印到虚拟打印机时会发生什么。蓝色框是我使用
PrintDocument.Print()
并选择物理打印机时发生的情况

有人知道为什么会发生这种情况吗?更重要的是,我能做些什么来解决它


我的打印按钮的代码。。。 “我的打印预览”按钮的代码。。。 PrintPage()例程的代码。。。

我还尝试将
originalmargin
设置为
False
,并使用
e.MarginBounds
代替我的
边界
矩形。两者的结果完全相同

我认为问题在于,在绘制矩形时,您使用的设置是:
e.PageSettings.PrintableArea.X
,这可能因您使用的打印机而异。您可能希望使用以下内容:

Dim Bounds As New Rectangle(e.DefaultPageSettings.Margins.left, e.DefaultPageSettings.Margins.top, e.MarginBounds.Width, e.MarginBounds.Height)

请记住,这可能会导致边缘在打印机中被切断而无法打印,除非打印机的可打印区域设置不正确…

感谢您的回复,但我不知道更改X或Y坐标将如何解决问题?顶部和左侧都很好,但右侧和底部都不正确。另外,我在
e
中没有看到
DefaultPageSettings
对象,它是
System.Drawing.Printing.PrintPageEventArgs
对象。
Dim doc As New Printing.PrintDocument
doc.OriginAtMargins = True
doc.DefaultPageSettings.Margins = New Printing.Margins(50, 50, 50, 50)

AddHandler doc.PrintPage, AddressOf PrintPage

Dim preview As New PrintPreviewDialog
preview.Document = doc
preview.ShowDialog(Me)
Public Sub PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    Dim Bounds As New Rectangle(e.PageSettings.PrintableArea.X, e.PageSettings.PrintableArea.Y, e.MarginBounds.Width, e.MarginBounds.Height)
    e.Graphics.DrawRectangle(Pens.Black, Bounds)
    e.HasMorePages = False
End Sub
Dim Bounds As New Rectangle(e.DefaultPageSettings.Margins.left, e.DefaultPageSettings.Margins.top, e.MarginBounds.Width, e.MarginBounds.Height)