Stampare un’immagine con .NET

Nel caso sia necessario stampare un’immagine rispettando le dimensioni della stessa e posizionandola in modo preciso sulla pagina il .NET Framework offre nativamente tutto ciò che ci serve. Occorre però fare alcune considerazioni sulle unità di misura che mi annoto a mia futura memoria e per eventaule utilità di altri:

  1.  Per comodità si esprimeranno le misure dei margini che utilizzerò per posizionare l’immagine e le dimensioni della stessa in millimetri.
  2. L’unità di misura dei margini nell’oggetto DefaultPageSettings sono espresse in centesimi di pollice.
  3. Oltre ai magini si deve tenere conto anche degli HardMarginX e HardMarginY espressi anch’essi in centesimi di pollice e che rappresentano i magini fisici della stampante. Gli HardMarginX e HardMarginY sono in margini al di sotto di cui non è possibile scendere e se utilizziamo i margini per posizionare l’immagine occorre ricordare che il margine reale e il margine impostao tramite DefaultPageSettings.Margins più HardMarginX per Left e HardMarginY per Top.
  4. Le dimensioni delle immagini sono date in pixels e dpi (Dots per inch) quindi le dimensioni in pollici saranno Inches = Pixels/DPI che andranno ancora convertite in centesimi di pollice moltilicando per 100.

Di seguito un banale esempio:

Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
   ‘Impostazione margini left, right, top, bottom
   Util.SetMarginInMillimeters(Me.Document.DefaultPageSettings, 15, 15, 20, 20)

   Me.PrintPreviewDialog.ShowDialog(Me)
End Sub

Private Sub Document_PrintPage(ByVal sender As Object, _
          ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Document.PrintPage
   ‘Impostazione stampa di una sola pagina
   e.HasMorePages = False

   e.Graphics.DrawImage(My.Resources.Test, _
      e.MarginBounds.Left, e.MarginBounds.Top, _
      Util.PixelsToHundredthsOfInch(My.Resources.Test.Width, My.Resources.Test.HorizontalResolution), _
      Util.PixelsToHundredthsOfInch(My.Resources.Test.Height, My.Resources.Test.VerticalResolution))
End Sub

L’esempio completo è disponibile al seguente link: