我们在打印图像和文字时遇到了一个奇怪的问题。当我们在机器上打印第一次时,只有背景向上和向左移动,并打印在错误的位置。 文本打印正确。 当我们再次打印相同时,一切都很好.... bg和文本..? 卸载并重新安装应用程序或重新启动计算机不会发生任何变化,一切都能保持正常打印。
因此,因为只有bg图像打印错误,我们怀疑问题在于HardMargin属性。 (只有该方法使用HardMargin)
为什么问题只发生在第一次执行对我们来说是个谜? 有没有人有任何线索?
private void DrawBackground(PrintPageEventArgs ev, string bgFilePath, float offsetX, float offsetY)
{
try
{
System.Drawing.Image img = System.Drawing.Image.FromFile(bgFilePath);
float w = (float)Width;
float h = (float)Height;
float x = ev.PageSettings.HardMarginX + (offsetX);
float y = ev.PageSettings.HardMarginY + (offsetY);
ev.Graphics.DrawImage(img, x, y, w, h);
}
catch (Exception ex)
{
//Errors.CatchError
}
}
//Method for printing text ( on top of background )
RectangleF printRect = new RectangleF();
printRect.X = offsetX + (rtfPrintscale * (float)v.X);
printRect.Y = offsetY + (rtfPrintscale * (float)v.Y);
printRect.Width = rtfPrintscale * (float)v.Width;
printRect.Height = rtfPrintscale * (float)v.Height;
............................................... ............. 回答答案1:
嗨JDMX,
你所说的是有道理的。我在想着同样的道路。
我会解释究竟发生了什么:
我在笔记本电脑上安装了该应用以进行测试。在这台笔记本电脑上,我最近安装了一台打印机驱动程序,用于在无线打印机上打印。
生成打印预览时,我注意到背景图像放置不正确。它有负x& y值。我认为这是代码中的一个错误,所以回到开发机器并测试......一切正常。所以我在更多的机器上进行了测试,...仍然一切正常。
所以我回到了笔记本电脑,打印出来了。打印与打印预览相同。困惑,我再次生成了打印预览,现在一切都正确了???
所以我认为这是appsettings的一个问题,所以我卸载了一个重新安装...仍然一切都打印正确。所以我重新启动,但没有用。
我们的问题是我们甚至无法重现或调试错误......
是否有打印机驱动程序只是用于测试或我们可以使用的东西?
顺便说一句:我正在以多种方式设置保证金:
ThePrintDocument.OriginAtMargins = true;
ThePrintDocument.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
...
ThePrintDocument.DefaultPageSettings.Margins.Left = 0;
ThePrintDocument.DefaultPageSettings.Margins.Top = 0;
ThePrintDocument.DefaultPageSettings.Margins.Bottom = 0;
ThePrintDocument.DefaultPageSettings.Margins.Right = 0;
...编辑:解决方案:.................................... ........
嗯,这就是我们的想法:
1)Printersettings的默认余量为100
2)您将单位设置为毫米
3)您将OriginArMargins设置为true
4)将边距设为0
实际发生的是“原点”设置为默认边距100,解释为100毫米。因此,您的内容现在以100毫米的边距打印。
您需要做的是首先将边距设置为0,然后将originatmargins设置为true。
HTH。
答案 0 :(得分:1)
第一次在机器上或第一次对新安装的打印驱动程序(未重新安装......设置仍然存在)
如果它是针对打印驱动程序的,那么我认为dotNet以0开头作为HardMarginX和HardMarginY的设置。第一次打印后,打印机将想要用于这两个值的设置发送回dotNet。在这一点上,一切都打印正确。
源中没有的是对PageSettings.Margins值的任何操作。您是设置它们还是使用默认设置。
答案 1 :(得分:1)
使用OriginAtMargins = true
时然后PrintController获取HardMargins并使用适当的TranslateTransform而不是Ev.Graphics。
请注意,Graphics.Unit =显示(此点)
更改Graphics.Unit时,不会转换Graphics.Transform。 你可以做一些坐标转换:
Protected Sub AdjustPageUnit(ByVal g As Graphics, PageUnit As GraphicsUnit)
If g.PageUnit <> PageUnit AndAlso g.PageUnit = GraphicsUnit.Display Then
g.PageUnit = PageUnit
If OriginAtMargins Then
If PageUnit = GraphicsUnit.Pixel Then
g.TranslateTransform(g.Transform.OffsetX * ((g.DpiX / 100.0F) - 1.0F), _
g.Transform.OffsetY * ((g.DpiY / 100.0F) - 1.0F))
Else
Dim fx = FactorInchToUnit(PageUnit) / 100.0F - 1.0F
g.TranslateTransform(g.Transform.OffsetX * fx, g.Transform.OffsetY * fx)
End If
End If
End If
End Sub
Public Function FactorInchToUnit(ByVal U As GraphicsUnit) As Single
Select Case U
'Case GraphicsUnit.World 'No sé que hacer...
Case GraphicsUnit.Millimeter : Return 25.4F
Case GraphicsUnit.Display : Return 100.0F
Case GraphicsUnit.Document : Return 300.0F
Case GraphicsUnit.Point : Return 72.0F
Case GraphicsUnit.Inch : Return 1.0F
Case Else : Throw New NotImplementedException("FactorInchToUnit Factor")
End Select
End Function
请注意,所有打印结构都使用1/100英寸单位(页边距,PageBounds,MarginBounds)