Bild drucken über eDocPrinter aber ohne Speichern unter - Abfrage

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Volker Bunge.

    Bild drucken über eDocPrinter aber ohne Speichern unter - Abfrage

    Hallo zusammen,

    ich möchte eine Bilddatei (JPG, BMP, PNG usw.) über eine Picturebox drucken und automatisch als PDF abspeichern lassen.

    Grundsätzlich läuft auch schon alles wie gewünscht.

    Das Einzige was mich jetzt noch stört ist die Dialogabfrage beim Speichern.

    Hier mal mein bisheriger Code

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. TBox_Bildpfad.Text = "C:\Kalender 2019.bmp"
    3. 'PBox_Bilddrucken.Image = Image.FromFile("C:\Temp\Outlook\03_ Lupe.png")
    4. 'PBox_Bilddrucken.Image = Image.FromFile("C:\Temp\Outlook\05_ Download.jpg")
    5. 'PBox_Bilddrucken.Image = Image.FromFile("C:\Temp\Outlook\04_ Bild1.png")
    6. PBox_Bilddrucken.Image = Image.FromFile(TBox_Bildpfad.Text)
    7. PrintDocument1.DocumentName = "C:\Temp\Outlook\Test.pdf"
    8. PrintDocument1.Print()
    9. 'PBox_Bilddrucken.Image.Save("C:\Temp\Outlook\Test.pdf")
    10. End Sub
    11. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    12. Dim gr As Graphics = e.Graphics
    13. ' Verweis auf das Bild festlegen
    14. Dim oImage As Image = PBox_Bilddrucken.Image
    15. ' Rechteck für den Ausdruck festlegen
    16. ' Position + Originalgröße
    17. Dim p As New Point(e.MarginBounds.Left, e.MarginBounds.Top)
    18. ' Hier nun das Bild in der Originalgröße oder der maximalen Breite anzeigen lasssen bzw. drucken
    19. Dim hDC As Long
    20. 'Die log. Pixels pro Zoll für den Bildschirm werden ermittelt:
    21. 'hDC = CreateICA("DISPLAY", "", "", 0&)
    22. DPI_Breite = 92 'GetDeviceCaps(hDC, LOGPIXELSX)
    23. DPI_Höhe = 92 'GetDeviceCaps(hDC, LOGPIXELSY)
    24. 'DeleteDC hDC
    25. 'Die Breite/Höhe des Bildschirm-Fensters (in Pixeln) wird ermittelt:
    26. Bildschirmbreite = 1920 ' GetSystemMetrics&(SM_CXSCREEN)
    27. Bildschirmhöhe = 1080 ' GetSystemMetrics&(SM_CYSCREEN)
    28. Dim BreiteinCM As Double
    29. Dim HöheinCM As Double
    30. BreiteinCM = 21
    31. HöheinCM = 29.7
    32. BildBreitePixel = Bildergroesse(TBox_Bildpfad.Text, Bildgroesse_ENUM.Breite)
    33. BildHöhePixel = Bildergroesse(TBox_Bildpfad.Text, Bildgroesse_ENUM.Höhe)
    34. PBox_Bilddrucken.Height = DPI_Höhe * HöheinCM / 2.54
    35. PBox_Bilddrucken.Width = DPI_Breite * BreiteinCM / 2.54
    36. BreiteinCM = 19
    37. ' Höhe proportional anpassen
    38. HöheinCM = (BildHöhePixel / BildBreitePixel) * BreiteinCM
    39. PBox_Bilddrucken.Top = 10
    40. PBox_Bilddrucken.Left = 10
    41. ' Prüfen, ob die Pixel das DIN A4 Format übersteigen, wenn ja, das Bild proportional auf das max. verkleinern
    42. If BildHöhePixel > Fix(72 * HöheinCM / 2.54) Or BildBreitePixel > Fix(72 * BreiteinCM / 2.54) Then
    43. 'PBox_Bilddrucken.Height = Fix(72 * HöheinCM / 2.54)
    44. BildHöhePixel = Fix(72 * HöheinCM / 2.54)
    45. ' PBox_Bilddrucken.Width = Fix(72 * BreiteinCM / 2.54)
    46. BildBreitePixel = Fix(72 * BreiteinCM / 2.54)
    47. Else
    48. ' andernfalls, Originalbreite und -höhe einstellen
    49. PBox_Bilddrucken.Height = BildHöhePixel
    50. PBox_Bilddrucken.Width = BildBreitePixel
    51. End If
    52. ' Ein paar Infos zu dem Bild abspeichern
    53. e.Graphics.DrawString("E-Mail Absender: " & RBox_Absender.Text & vbCrLf & "Betreff: " & RBox_Betreff.Text & vbCrLf & "Datum: " & Lbl_DatumUhrzeit.Text & vbCrLf & "Dateiname: " & System.IO.Path.GetFileName(TBox_Bildpfad.Text), New Font("Arial", 12), Brushes.Black, New Point(10, 15))
    54. 'Dim r As New Rectangle(p.X, p.Y, oImage.Width, oImage.Height)
    55. Dim r As New Rectangle(10, 120, BildBreitePixel, BildHöhePixel)
    56. ' Bild drucken im angegebenen Rechteck drucken
    57. gr.DrawImage(oImage, r)
    58. 'gr.Dispose()
    59. ' Picturebox wieder klein machen
    60. PBox_Bilddrucken.Top = 76
    61. PBox_Bilddrucken.Left = 300
    62. PBox_Bilddrucken.Width = 156
    63. PBox_Bilddrucken.Height = 127
    64. End Sub


    (Das Umstellen auf den eDoc-Printer fehlt hier zwar noch, stellt aber kein Problem dar)

    Gruß

    Volker
    @Volker Bunge Was soll er tun?
    Was tut er?
    Was tut er nicht?
    Überprüfe, ob der gepostete Code Deinen Effekt vollständig reproduziert,
    vermeide dabei, dass wir wiederholt nachfragen müssen.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Volker Bunge: Stell über PrintDocument1.PrinterSettings.PrinterName den Namen eines PDF-Druckers ein und dann noch PrintDocument1.PrintToFile = True. So mach ich es und so klappt es bei mir.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo RodFromGermany,

    vielen Dank für die schnelle Antwort, aber die habe ich kpl. nicht verstanden, sorry.

    Der Code macht grundsätzlich dass, was er tun soll. Das einzige was mich halt stört ist, dass der Benutzer die Speichern-Unter-Abfrage bestätigen muss.

    Leider sind solche Antworten nicht gerade hilfreich.

    Hallo VaporiZed,vielen Dank für die schnelle Antwort.

    VB.NET-Quellcode

    1. PrintDocument1.PrinterSettings.PrinterName = "eDocPrinter PDF Pro"
    2. PrintDocument1.DocumentName = Dateiname
    3. PrintDocument1.PrintToFile = True
    4. PrintDocument1.Print()


    Leider sagt er mit bei PrintToFile das es kein Member von Printdocument ist.

    Gruß

    Volker
    Bilder
    • Bild1.png

      7,21 kB, 538×115, 55 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Volker Bunge“ ()

    Volker Bunge schrieb:

    Leider sind solche Antworten nicht gerade hilfreich.
    Kopiere Deinen Code in ein neues leeres Projekt und starte es.
    Ich freue mich, dass Du keine Probleme mehr hast.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Volker Bunge: Nee, ist auch Teil von PrinterSettings, nicht vom PrintDocument
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo RodFromGermany,

    habe jetzt Deine Antwort verstanden. Da fehlte tatsächlich noch etwas. Sorry.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Enum Bildgroesse_ENUM
    3. Höhe = 1
    4. Breite = 2
    5. End Enum
    6. Public Bildschirmbreite As Long, Bildschirmhöhe As Long
    7. Public DPI_Breite As Long, DPI_Höhe As Long
    8. Public BildBreitePixel As Long
    9. Public BildHöhePixel As Long
    10. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    11. PBox_Bilddrucken.Text = "C:\Kalender 2019.bmp"
    12. PBox_Bilddrucken.Image = Image.FromFile(PBox_Bilddrucken.Text)
    13. PrintDocument1.DocumentName = "C:\Temp\Outlook\Test.pdf"
    14. PrintDocument1.PrinterSettings.PrinterName = "eDocPrinter PDF Pro"
    15. PrintDocument1.PrinterSettings.PrintToFile = True
    16. PrintDocument1.Print()
    17. 'PBox_Bilddrucken.Image.Save("C:\Temp\Outlook\Test.pdf")
    18. End Sub
    19. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    20. Dim gr As Graphics = e.Graphics
    21. ' Verweis auf das Bild festlegen
    22. Dim oImage As Image = PBox_Bilddrucken.Image
    23. ' Position + Originalgröße
    24. Dim p As New Point(e.MarginBounds.Left, e.MarginBounds.Top)
    25. DPI_Breite = 92 'GetDeviceCaps(hDC, LOGPIXELSX)
    26. DPI_Höhe = 92 'GetDeviceCaps(hDC, LOGPIXELSY)
    27. 'Die Breite/Höhe des Bildschirm-Fensters (in Pixeln) wird ermittelt:
    28. Bildschirmbreite = 1920 ' GetSystemMetrics&(SM_CXSCREEN)
    29. Bildschirmhöhe = 1080 ' GetSystemMetrics&(SM_CYSCREEN)
    30. Dim BreiteinCM As Double
    31. Dim HöheinCM As Double
    32. BreiteinCM = 21
    33. HöheinCM = 29.7
    34. BildBreitePixel = Bildergroesse(PBox_Bilddrucken.Text, Bildgroesse_ENUM.Breite)
    35. BildHöhePixel = Bildergroesse(PBox_Bilddrucken.Text, Bildgroesse_ENUM.Höhe)
    36. PBox_Bilddrucken.Height = DPI_Höhe * HöheinCM / 2.54
    37. PBox_Bilddrucken.Width = DPI_Breite * BreiteinCM / 2.54
    38. BreiteinCM = 19
    39. ' Höhe proportional anpassen
    40. HöheinCM = (BildHöhePixel / BildBreitePixel) * BreiteinCM
    41. PBox_Bilddrucken.Top = 10
    42. PBox_Bilddrucken.Left = 10
    43. ' Prüfen, ob die Pixel das DIN A4 Format übersteigen, wenn ja, das Bild proportional auf das max. verkleinern
    44. If BildHöhePixel > Fix(72 * HöheinCM / 2.54) Or BildBreitePixel > Fix(72 * BreiteinCM / 2.54) Then
    45. 'PBox_Bilddrucken.Height = Fix(72 * HöheinCM / 2.54)
    46. BildHöhePixel = Fix(72 * HöheinCM / 2.54)
    47. ' PBox_Bilddrucken.Width = Fix(72 * BreiteinCM / 2.54)
    48. BildBreitePixel = Fix(72 * BreiteinCM / 2.54)
    49. Else
    50. ' andernfalls, Originalbreite und -höhe einstellen
    51. PBox_Bilddrucken.Height = BildHöhePixel
    52. PBox_Bilddrucken.Width = BildBreitePixel
    53. End If
    54. ' Ein paar Infos zu dem Bild abspeichern
    55. ' e.Graphics.DrawString("E-Mail Absender: " & RBox_Absender.Text & vbCrLf & "Betreff: " & RBox_Betreff.Text & vbCrLf & "Datum: " & Lbl_DatumUhrzeit.Text & vbCrLf & "Dateiname: " & System.IO.Path.GetFileName(PBox_Bilddrucken.Text), New Font("Arial", 12), Brushes.Black, New Point(10, 15))
    56. 'Dim r As New Rectangle(p.X, p.Y, oImage.Width, oImage.Height)
    57. Dim r As New Rectangle(10, 120, BildBreitePixel, BildHöhePixel)
    58. ' Bild drucken im angegebenen Rechteck drucken
    59. gr.DrawImage(oImage, r)
    60. ' Picturebox wieder klein machen
    61. PBox_Bilddrucken.Top = 76
    62. PBox_Bilddrucken.Left = 300
    63. PBox_Bilddrucken.Width = 156
    64. PBox_Bilddrucken.Height = 127
    65. End Sub
    66. Public Function Bildergroesse(FilePath As String, Rueckgabewert As Bildgroesse_ENUM)
    67. Dim bmp As New Bitmap(FilePath)
    68. If Rueckgabewert = 1 Then
    69. Return bmp.Height
    70. Else
    71. Return bmp.Width
    72. End If
    73. End Function
    74. End Class


    Habe leider gedacht, dass die Profis schon anhand meines ersten Codes erkennen, wo der Fehler liegt. Der o. g. Code ist jetzt aber soweit vollständig, dass er funktioniert. (Die Controlls und das Anpassen der Pfade muss natürlich noch gemacht werden)

    Frage: Oder muss ich erst den eDoc-Printer erst irgendwie einstellen, so dass die Abfrage nicht mehr kommt?

    Gruß

    Volker

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Volker Bunge“ ()

    @Volker Bunge Nachdem ich Option Strict On gemacht und eine Klasse für PBox_Bilddrucken angelegt habe, hat der Code sofort richtig funktioniert.
    Anmerkung zum individuellen PDF-Drucker:
    in .DocumentName habe ich nur den Dokument-Namen stehen, nicht aber den Pfad, den hat er bei mir vom letzten Bild genommen und im Save-Dialog angeboten.
    Dieser Dialog ist aber abhängig vom PDF-Printer und bei mit nicht per Property vorgebbar.
    Wie das bei andern Treibern läuft, muss individuell aufgeklärt werden.
    Möglicherweise kann man da die Werte von Properties über deren Namen setzen.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,

    vielen Dank für die Infos.

    Die Klasse für PBox_Bilddrucken: Wo für hast Du die angelegt? Der Name war für ein Picturebox-Control.

    Also muss ich jetzt über Registry o. ä. versuchen, den eDoc-Dialog zu steuern. Werde nach her mal etwas googeln.

    Hat jemand anderes von Euch gff. eine Lösung hier für?

    Gruß

    Volker

    Volker Bunge schrieb:

    Der Name war für ein Picturebox-Control.
    Wegen der Property .Text.
    Ansonsten OK.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da jetzt noch keine Reaktion auf meine Posts kam, stellt sich die Frage, wie da Dein Versuchsergebnis dazu ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    sorry, das ich mich erst jetzt bei Dir melde.

    Die PrintDocument1.PrinterSettings.PrintToFile = True war so jetzt richtig.

    Leider muss ich mich jetzt auf eine anderen Lösungweg machen, da wohl die Save-Abfrage so nicht umgangen bzw. automatisiert werden kann.

    Solltest Du eine Lösung haben, wäre ich um jeden Tipp dankbar.

    Gruß
    Volker
    Hattest Du auch für PrintDocument1.PrinterSettings.PrintFileName einen Zieldateipfad eingestellt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    habe eine Lösung gefunden. Die ganzen Printdocument-Einstellungen sind dabei so gut wie nicht nötig (hoffe ich doch mal).

    Schon einmal soviel vorab: Man muss/kann über die Registry-Einträge alles beim eDoc-Printer steuern.

    Werde die aber noch mal so fertig machen, dass sie auch funktioniert. Danach werde ich sie hier einstellen.

    Gruß

    Volker
    Hallo zusammen,

    so, habe jetzt das mit dem Bilderdrucken in eine PDF hinbekommen.

    Das Ganze funktioniert sogar sehr schnell.

    Voraussetzung: eDoc Printer Pro muss installiert sein.

    Damit Ihr alle was davon habt, packe ich mal das Projekt hier als RAR-Datei rein.

    Die Richtextboxen habe ich nur schon einmal reingepackt, damit der Text über dem Bild schon einmal steht.

    Es ist noch ein paar Optimierungen vorzunehmen, aber da dies ja nur ein Teil meines gesamten Projektes ist, habe ich hier drauf verzichtet.

    Genau so könnte man auch noch ein paar andere Einstellungen für eDoc-Printer vornehmen lassen, aber dass kann jetzt hoffentlich jeder selbst noch für sein Projekt nachholen.

    Was ich noch eingestellt habe ist "Option Strict on".

    Was mich persönlich noch interessieren würde ist die Frage, ob man die Höhe und Breite des Textes irgendwie begrenzen kann bzw. die Höhe abfragen kann. Grund ist einmal, dass ich über die Höhe die obere Position immer mit dem gleichen Abstand versehen könnte, egal was in dem Text drin steht und die Breite natürlich so begrenzen könnte, dass der Text bei keinem Seitenformat über den rechten Rand hinausragen würde. Aber das ist ehr nur eine Kleinigkeit.

    Hoffe, dass jeder das Projekt öffnen und nutzen kann und die Erklärungen im Code ausreichen, um es zu verstehen bzw. Veränderungen vornehmen zu können.

    Gruß
    Volker

    P.S. Ob die Anzeige der PDF - Datei auch mit jeden PDF-Anzeigeprogramm funktioniert, wäre hier noch zu klären. Ich benutze PDF-XChange Viewer. Damit klappt es auf jeden Fall. Sollte es mal nicht klappen, so wäre ich über eine Lösung dankbar, dann kann man das dort noch einbauen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()