仅在首次打印时使用Hardmargin的奇怪打印问题(WinForms)

时间:2010-02-19 14:27:57

标签: c# .net printing

我们在打印图像和文字时遇到了一个奇怪的问题。当我们在机器上打印第一次时,只有背景向上和向左移动,并打印在错误的位置。 文本打印正确。 当我们再次打印相同时,一切都很好.... 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。

2 个答案:

答案 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)