Bild vor dem drucken Skalieren / mehre Seiten drucken

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von munsi.

    Bild vor dem drucken Skalieren / mehre Seiten drucken

    Hallo,

    ich habe ein kleines Problem. Ich bin dabei einen kleinen Dateiviewer zu schreiben. Soweit funktioniert auch alles nur leider komme ich mit dem Drucken nicht klar. Ich möchte gern die Bilder auf die volle Größe des Blattes gedruckt haben. Also wenn im Drucker A4 ausgewählt ist soll das Bild auf A4 Größe sklaiert werden. Genauso mit A3. Jetzt wird das Bild leider nur so groß gedruckt wie in der PictureBox angezeigt. Zusätzlich habe ich das Problem das bei mehrseiten Tiff Dateien nur die Seite gedruckt wird die in der PictureBox angezeigt wurde.

    Hier mal der Code den ich schon habe:

    VB.NET-Quellcode

    1. Private Sub cmddrucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmddrucken.Click
    2. Dim Setupdlg As New PageSetupDialog
    3. With Setupdlg
    4. .PrinterSettings = PrintDocument1.PrinterSettings
    5. .PageSettings = PrintDocument1.DefaultPageSettings
    6. PrintDialog1.Document = PrintDocument1
    7. If .ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    8. PrintDocument1.PrinterSettings = .PrinterSettings
    9. PrintDocument1.DefaultPageSettings = .PageSettings
    10. PrintDocument1.Print()
    11. End If
    12. End With
    13. End Sub
    14. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    15. Dim gr As Graphics = e.Graphics
    16. Dim Image As Image = PictureBox1.Image
    17. Dim p As New Point(e.MarginBounds.Left, e.MarginBounds.Top)
    18. Dim r As New Rectangle(p.X, p.Y, Image.Width, Image.Height)
    19. gr.DrawImage(Image, r)
    20. gr.Dispose()
    21. End Sub

    Kann mir jemand von euch sagen wie ich das am besten umsetzen kann.?

    Vielen Dank für eure Hilfe.
    Gruß
    Sebastian
    Danke für den Tipp, aber leider bringt der mich nicht weiter. Ich habe diesen bereits in die Picturebox eingbaut. Wie bekomme ich es aber hin das die Seitengröße über den PageSetupDialog automatisch an den Drucker übergeben wird und das Bild auf diese Größe skaliert wird.

    Danke für die Hilfe
    Sebastian
    Hat keiner mehr eine Idee wie ich das Drucken der Grafik umsetzen kann? Wie gesagt das reine Ausdrucken ist kein Problem nur wird die Grafik nur in der Größe der Picturebox angezeigt aber nicht auf die ausgwählte Seitengröße gezoomt.

    Danke für euere Hilfe.
    Weiterhin wird das Bild bei Anpassung der Breite und/oder Höhe interpoliert, damit die Qualität erhalten bleibt.

    So steht es da.
    Damit dürfte es kein Problem sein das Bild zu vergrößern bzw zu verkleinern.

    woran hapert es denn nun ?

    Verstehst du diese Funktion nicht ? Kannst du sie nicht umsetzen ?

    Hilf ins mal weiter.
    Hallo Bernd,

    nochmal danke für deine Hilfe. Also die Funktion nutze ich bereits um ein Bild in einer vorhanden Picturebox zu vergrßern oder zu verkleinern. Wie der Nutzer es wünscht. Aufgrund deines Tips habe ich mir nun gedacht eine zweite Picturebox zu erstellen und ihr automatisch die Größe der Seiteneinstellung zu geben. Leider habe ich dort einen Fehler drin da der Ausdruck immer nur ein leeres Blatt ist. Ich vermute das meine Übergabe der Größe an die Picturebox nicht korrekt ist. Wie kann man die Seiteneinstellungen an eine Picturebox übergeben?

    Hier mal der Quelltext

    VB.NET-Quellcode

    1. Dim pb As New PictureBox
    2. Private Sub cmddrucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmddrucken.Click
    3. Dim Setupdlg As New PageSetupDialog
    4. ' Seiteneinstellungen festlegen
    5. With Setupdlg
    6. .PrinterSettings = PrintDocument1.PrinterSettings
    7. .PageSettings = PrintDocument1.DefaultPageSettings
    8. If .ShowDialog(Me) = DialogResult.OK Then
    9. .PageSettings.Margins = _
    10. Printing.PrinterUnitConvert.Convert( _
    11. .PageSettings.Margins, _
    12. Printing.PrinterUnit.ThousandthsOfAnInch, _
    13. Printing.PrinterUnit.HundredthsOfAMillimeter)
    14. Dim p As New Point(DefaultMargin.Vertical, DefaultMargin.Horizontal)
    15. 'Bild aus der Picturebox1 in eine neue Picturebox laden und diese auf die Größe des Blattes zoomen
    16. With pb
    17. .Image = PictureBox1.Image
    18. .Location = New Point(12, 12)
    19. .Size = New Size(p.X, p.Y)' hier ist glaube ich der Fehler?
    20. .Image = AutoSizeImage(oBitmap, .ClientRectangle.Width, .ClientRectangle.Height)
    21. End With
    22. PrintDocument1.Print()
    23. End If
    24. End With
    25. End Sub
    26. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    27. Dim gr As Graphics = e.Graphics
    28. Dim Bild As Image = pb.Image
    29. Dim p As New Point(e.MarginBounds.Left, e.MarginBounds.Top)
    30. Dim r As New Rectangle(p.X, p.Y, Bild.Width, Bild.Height)
    31. gr.DrawImage(Bild, r)
    32. gr.Dispose()
    33. End Sub


    Sorry wenn der Quellcode etwas kryptisch aussieht :wacko: Bin noch totaler Anfänger.

    Danke und Grüße
    Sebastian

    munsi schrieb:

    Dim pb As New PictureBox

    Vielleicht Kopierst du das Bild direkt in eine Image und nicht in eine PictureBox. Warum den Umweg ?

    VB.NET-Quellcode

    1. Dim Img As Image = ...


    VB.NET-Quellcode

    1. Dim pb As New PictureBox

    munsi schrieb:

    Dim gr As Graphics = e.Graphics
    Dim Bild As Image = pb.Image


    wir ja Deklariert.

    Aber wo weist du pb denn das Image zu ?


    Da ist noch nichts drin.
    Danke für deine Mühe aber ich steh irgendwie auf dem Schlauch.
    Du selbst hattest mir doch den Tip mit der Zoomfunktion der Picturebox gegeben. Das habe ich versucht umzusetzen und daher eine neue Picturebox generiert.

    Bernd schrieb:




    Visual Basic Quellcode

    VB.NET-Quellcode

    1. 1Dim pb As New PictureBox



    Zitat von »munsi«

    VB.NET-Quellcode

    1. Dim gr As Graphics = e.Graphics
    2. Dim Bild As Image = pb.Image

    wir ja Deklariert.

    Aber wo weist du pb denn das Image zu ?
    Da ist noch nichts drin.

    Ich dachte ich weiße hier pb das Image zu

    VB.NET-Quellcode

    1. With pb
    2. .Image = PictureBox1.Image
    3. .Location = New Point(12, 12)
    4. .Size = New Size(pos.X, pos.Y)
    5. .Image = AutoSizeImage(oBitmap, .ClientRectangle.Width, .ClientRectangle.Height)
    6. End With


    Wenn ich die Zeile

    VB.NET-Quellcode

    1. .Size = New Size(pos.X, pos.Y)


    wie folgt anpasse

    VB.NET-Quellcode

    1. .Size = New Size(1024, 720)

    Bekomme ich das Bild ausgedruckt. Aber das ist ja dann nicht dynamisch je nach Größe des ausgewählten Blattes.

    Ich denke ich habe hier zwei Fehler drin

    VB.NET-Quellcode

    1. Private Sub cmddrucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmddrucken.Click
    2. Dim Setupdlg As New PageSetupDialog
    3. ' Seiteneinstellungen festlegen
    4. With Setupdlg
    5. .PrinterSettings = PrintDocument1.PrinterSettings
    6. .PageSettings = PrintDocument1.DefaultPageSettings
    7. If .ShowDialog(Me) = DialogResult.OK Then
    8. .PageSettings.Margins = _
    9. Printing.PrinterUnitConvert.Convert( _
    10. .PageSettings.Margins, _
    11. Printing.PrinterUnit.ThousandthsOfAnInch, _
    12. Printing.PrinterUnit.HundredthsOfAMillimeter)
    13. Dim pos As New Point(DefaultMargin.Vertical, DefaultMargin.Horizontal) 'Fehler? Dachte das ich hier die Seiteneinstellungen auslese an die Variable pos übergebe?
    14. 'Bild aus der Picturebox1 in eine neue Picturebox laden und diese auf die Größe des Blattes zoomen
    15. With pb
    16. .Image = PictureBox1.Image
    17. .Location = New Point(12, 12)
    18. .Size = New Size(pos.X, pos.Y) 'Fehler2, die Größe der Seiteneinstellungen sollte hier übernommen werden und die Picturebox auf diese Größe angepasst werden
    19. .Image = AutoSizeImage(oBitmap, .ClientRectangle.Width, .ClientRectangle.Height)
    20. End With
    21. PrintDocument1.Print()
    22. End If
    23. End With
    24. End Sub

    Vielleicht ist aber auch der ganze Weg komplett flasch? Wenn ja wie würde man es richtig machen.
    Danke für deine Mühe.
    Hab es hinbekommen. Nach mehrstündiger Suche habe ich eine Seite im Netz gefunden die den Druckvorgang sehr gut beschreibt. Da ich nicht weiß ob das Verlinken erwünscht ist, lasse ich das lieber. Für alle die das gleiche Problem beim Drucken haben hier die Lösung

    Aufruf der Seiteneinstellungen und Auswahl des Druckers
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub cmddrucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmddrucken.Click
    2. Dim Setupdlg As New PageSetupDialog
    3. ' Bild an Printerdialog weiterleiten um Seiteneinstellungen festzulegen
    4. With Setupdlg
    5. .PrinterSettings = PrintDocument1.PrinterSettings
    6. .PageSettings = PrintDocument1.DefaultPageSettings
    7. If .ShowDialog(Me) = DialogResult.OK Then
    8. ' Hier wird ein Fehler (?!) ausgebügelt: VB .NET
    9. ' konvertiert anscheinend alle Werte von Zoll in
    10. ' Millimeter, da (vermutlich) im englischen Dialog die
    11. ' Werte in Inch eingegeben werden. Allerdings ist der
    12. ' Umrechnungsfaktor nicht genau Zoll:Millimeter,
    13. ' sondern etwas mehr, sodass beim Wert 10 bei erneutem
    14. ' Aufruf 9,9 in der TextBox steht (Umrechnungsfaktor
    15. ' 0,254).
    16. .PageSettings.Margins = _
    17. Printing.PrinterUnitConvert.Convert( _
    18. .PageSettings.Margins, _
    19. Printing.PrinterUnit.ThousandthsOfAnInch, _
    20. Printing.PrinterUnit.HundredthsOfAMillimeter)
    21. PrintDocument1.Print()
    22. End If
    23. End With
    24. End Sub



    Der Druckvorgang
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim gr As Graphics = e.Graphics
    3. Dim Bild As Image = oBitmap
    4. 'Größe der Seiteneinstellungen übernehmen
    5. Dim r As Rectangle = e.PageBounds
    6. 'Seitenränder definieren
    7. With r
    8. .X = 0
    9. .Y = 0
    10. End With
    11. Dim charactersOnPage As Integer = 0
    12. Dim linesPerPage As Integer = 0
    13. gr.DrawImage(Bild, r) 'drucke das Bild aus
    14. gr.DrawRectangle(Pens.Blue, r) 'zeichne ein blauches rechteck drumherum
    15. gr.Dispose() ' Inhalt von gr löschen
    16. End Sub



    Gruß
    Sebastian