drucken rechter Rand wird abgeschnitten

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Gottric.

    drucken rechter Rand wird abgeschnitten

    Guten Abend liebe VB-Gemeinde,
    ich blieb mit der Suche im Forum leider erfolglos von daher eröffne ich ein neues Thema.
    Es geht um folgendes:
    Ich erstell einen Screenshot von meiner Form und drucke diesen aus, bei der Vorschau alles perfekt und auch als ich zum Test nen PDF-Creator als drucker ausgewiesen habe stimmen die Seitenränder. Aber beim tatsächlichen Audruck fehlen ca. 1-2cm am rechten Rand.
    Mit der hilfe von einem Mitglied hier im Form habe ich auch einen Version die alles Mittig positioniert und alles in richtiger Propotion zueinander steht, mein persönlicher Favorite, leider ist der Ausdruck dann aber zu eng und schlecht leserlich für ältere Mitbürger ist mir gesagt worden. :) aus diesem Grund habe ich einen neuen Code mir erarbeitet der den Screenshot auf die komplette Fläche des Blattes streckt, der Übersichtsheit halber. Aber genau da liegt der Hund begraben, wie schon erwähnt fehlt beim tatsächlichen Audruck Teile des rechten Rand.

    Ist es möglich die Ränder einzugrenzen, also sagen wir er soll ca. 1cm von jedem Rand weglassen und den Srennshot auf diese Fläche stecken?
    das sind die beiden Codes die ich bis jetzt habe:

    VB.NET-Quellcode

    1. 'Drucker neu
    2. Dim oBitmap As Bitmap
    3. Dim WithEvents PrintDocument As New Printing.PrintDocument
    4. Dim PrintPreview As New PrintPreviewDialog
    5. Private Sub btndrucken_Click(sender As Object, e As EventArgs) Handles btndrucken.Click
    6. SendKeys.Send("%({PRTSC})")
    7. SendKeys.Flush()
    8. System.Threading.Thread.Sleep(100)
    9. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    10. Me.PrintDocument.DefaultPageSettings.Landscape = True
    11. With PrintPreview
    12. .Document = PrintDocument
    13. .ShowDialog()
    14. End With
    15. End Sub
    16. Private Sub PrintDocument_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument.PrintPage
    17. Dim ps = CType(sender, Printing.PrintDocument).DefaultPageSettings
    18. Dim pa = ps.PrintableArea
    19. Me.PrintDocument.PrinterSettings.PrinterName = "PDF-Creator"
    20. If ps.Landscape Then pa = New RectangleF(pa.X, pa.Y, pa.Height, pa.Width)
    21. e.Graphics.DrawImage(oBitmap, pa)
    22. End Sub


    VB.NET-Quellcode

    1. 'Mit Hilfe vom Forum Mittig positionierter Scrennshot
    2. Dim oBitmap As Bitmap
    3. Private Sub btndrucken_Click(sender As Object, e As EventArgs) Handles btndrucken.Click
    4. Try
    5. If oBitmap IsNot Nothing Then
    6. oBitmap.Dispose()
    7. End If
    8. SendKeys.Send("%({PRTSC})")
    9. SendKeys.Flush()
    10. System.Threading.Thread.Sleep(100) ' war bei mir erforderlich
    11. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    12. Me.PrintDocument1.DefaultPageSettings.Landscape = Me.Height < Me.Width ' Dies hier
    13. Using dlg = New PrintPreviewDialog
    14. dlg.Document = Me.PrintDocument1
    15. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    16. Return
    17. End If
    18. End Using
    19. Catch ex As Exception
    20. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    21. End Try
    22. End Sub
    23. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    24. Me.PrintDocument1.PrinterSettings.PrinterName = "PDF-Creator"
    25. Dim gr As Graphics = e.Graphics
    26. Dim rc1 = e.MarginBounds
    27. Dim rc2 = New Rectangle(0, 0, oBitmap.Width, oBitmap.Height)
    28. Dim rc As RectangleF
    29. Dim d1 As Double = rc1.Width / rc2.Width
    30. Dim d2 As Double = rc1.Height / rc2.Height
    31. If d1 > d2 Then
    32. rc = New RectangleF(0.0F, 0.0F, CSng(rc2.Width * d2), CSng(rc2.Height * d2))
    33. rc.Offset(rc1.Left + (rc1.Width - rc.Width) / 2, rc1.Top)
    34. Else
    35. rc = New RectangleF(0.0F, 0.0F, CSng(rc2.Width * d1), CSng(rc2.Height * d1))
    36. rc.Offset(rc1.Left, rc1.Top + (rc1.Height - rc.Height) / 2)
    37. End If
    38. gr.DrawImage(oBitmap, rc)
    39. End Sub


    Ich hoffe mir kann jemand helfen von euch, danke.

    Edit:
    hahahaha, aus Zufall beim ausprobieren jetzt ne Lösung gefunden die passen sollte, hier der Code dazu:
    Bezieht sich auf den ersten Code den ich gepostet habe.

    VB.NET-Quellcode

    1. If ps.Landscape Then pa = New RectangleF(pa.X + 20, pa.Y + 20, pa.Height - 40, pa.Width - 40)


    Ich lasse das Thema noch geöffnet bis morgen Abend, vielleich hat ja noch jemand ne elegantere Lösung. Diese Funktioniert zumindest mal in der Vorschau und im PDF-Creator. Tatsächlischen Ausdruck werde ich morgen machen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Gottric“ ()

    @Gottric Die Bildschirmkopie musst Du nicht über SendKeys machen, das geht besser z.B. so.
    Zum Drucken allgemnein gugst Du auch hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Heute den tatsächlichen Ausdruck gemacht. es zeigte sich dass die PDF sowie die Druckvorschau wieder nicht stimmten. Aus bisher ungeklätern Gründen, wollte oder konnte ja niemand beantworten.

    Zur Auflösung, dies ist der Code dass es genau mittig positioniert ist mit exact gleichen Seitenrändern:

    VB.NET-Quellcode

    1. If ps.Landscape Then pa = New RectangleF(pa.X, pa.Y, pa.Height - 40, pa.Width - 40)


    ps. die Screenshot funktion habe ich mir angesehen. Nur sehe ich nicht in wie fern diese, für meine Anwendung, besser sein soll als wenn ich es über die Tastenkombination mache. Von daher in meiner Anwendung so belassen wie bisher, dennoch vielen Dank für die Anregung @RodFromGermany.