2010-02-19 92 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)