2010-02-19 66 views
2

打印图像和文本时出现奇怪的问题。当我们在机器上首次打印时,只有背景上移并离开,并打印在错误的位置。 正文打印正确。 当我们再次打印相同的东西时,一切都很好.... BG和文字..? 卸载并重新安装应用程序或重新启动机器不会改变,所有内容都可以保持正常打印。仅在首次打印时出现Hardmargin的奇怪打印问题(WinForms)

所以,因为只有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,

你的意思是有道理的。我正在想同一条路。

我将解释究竟发生了什么:

我安装了应用程序在我的笔记本进行测试。在这台笔记本电脑上,我最近安装了用于在无线打印机上打印的打印机驱动

当生成打印预览时,我注意到背景图片放置不正确。它的y值为负值。我认为这是代码中的一个错误,所以回到开发机器并进行测试......一切正常。所以我在更多的机器上测试了它,...仍然一切正常。

所以我回到笔记本电脑,并打印出来。打印与打印预览相同。挡了,我再次生成了一个打印预览,现在一切都放在正确的?

所以我认为这是一个与appsettings的问题,所以我卸载了一个reistalled ...仍然一切都打印正确。所以我重新启动,有没有用..

我们的问题是,我们甚至不能复制或调试错误...

是否有可能只是为了测试出有什么我们可以工作的打印机驱动程序与??

BTW:我以多种方式设置页边距:

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

呃,设置printRect当HardMargin你在哪里正确吗? – 2010-02-19 15:55:35

+0

打印文本是通过另一种使用非托管win32调用(无hardmargin)的方法完成的...无论如何,文本总是打印良好,它的DrawImage和DrawRectangle有问题。 (因为错误的.NET Hardmargin ???) 问题也恶化了,我们不能在任何机器上重现行为,而我们不知道发生了什么...... – 2010-02-22 10:16:55

+0

它看起来像唯一的方法您将能够尝试重现该错误是从一个干净的操作系统开始。安装编辑器env和打印驱动程序并运行测试。每次测试后,你将不得不吹掉该操作系统并重新开始。您可能需要查看某种硬盘映像软件,以便您不必花费数小时等待重新加载。您也可能希望查看是否发生这种情况与其他打印机或不同的操作系统。最后,您可能只需要运行虚拟打印,以便在完成真实打印之前先打印出第一张打印件。 – JDMX 2010-03-02 14:59:01

回答

1

第一次机器还是第一次对新安装的打印驱动程序上(不重新安装...设置可能仍然存在)

如果对打印驱动程序,那么我会假设是, dotNet从0开始,作为HardMarginX和HardMarginY的设置。第一次打印后,打印机将回复给dotNet它们想要用于这两个值的设置。在哪一刻,所有东西都能正确打印。

不在源代码中的一件事是对PageSettings.Margins值的任何操作。你是设置这些还是使用默认值。

1

当您使用OriginAtMargins =真

然后PrintController得到HardMargins和使用apropiate 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)