Bild wird nicht richtig gedruckt

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Drachie.

    Bild wird nicht richtig gedruckt

    Moin zusammen, habe folgende Problem beim Drucken einer Bilddatei die vom Versandanbieder erstellt wird und per API abgerufen wurde. Die Datei wird komplett als png geliefert. Dies ekann ich auch auf den Normalen wege auf dem Labeldrucker auch ausdrucken (siehe bild1)

    sobald ich allerdings über das Progemierte Tool zur automatisierung drucke kommt das Label wie folg raus (siehe bild 2). dazu bekomme ich noch die Fehlermeldung "Ungültiger Parameter"

    und Bevor gefragt wird, der Code ist mit Option strict On geschrieben (ja, habe dazu gelernt :D )

    Auzug Quellcode Druckfunktion:

    VB.NET-Quellcode

    1. For Each item As String In ListBox8.Items
    2. 'Label drucken
    3. With PrintDocument1
    4. .PrinterSettings.PrinterName = "Labeldrucker"
    5. .Print()
    6. End With
    7. 'label nach dem drucken Loeschen
    8. If System.IO.File.Exists(did) = True Then
    9. System.IO.File.Delete(did)
    10. End If
    11. Next


    Das Label wird über die Variabel p3 geladen. p3 enthält den pfad zu der Datei samt LabelID

    Printpage settings:

    VB.NET-Quellcode

    1. ​Private Sub PrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim gr As Graphics = e.Graphics
    3. Dim oImage As Image = Image.FromFile(p3)
    4. gr.DrawImage(oImage, 0, 0, oImage.Width, oImage.Height)
    5. gr.Dispose()
    6. End Sub


    Fehlermeldung bei jedem png laben: "Ungültiger Parameter"

    das PGN Label soll per autodruck so rauskommen wie auf dem ersten bild. jmd eine idee was an den Code ggf. noch fehlt oder falsch ist?
    Bilder
    • IMG_3015.JPG

      1,81 MB, 2.448×3.264, 163 mal angesehen
    • IMG_3016.JPG

      1,31 MB, 2.448×3.264, 166 mal angesehen

    Drachie schrieb:

    "Ungültiger Parameter"
    Schmeiß mal diese Zeile raus:

    VB.NET-Quellcode

    1. gr.Dispose()
    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!

    VB.NET-Quellcode

    1. gr.Dispose()


    habe ich raus geschmissen. Fehlermeldung bleibt. jetzt wengistens passt der startpunkt. nur die dimmensionierung leider noch nicht so ganz... (siehe bild)
    Bilder
    • IMG_3018.JPG

      1,54 MB, 2.448×3.264, 164 mal angesehen

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

    @Drachie Poste mal so viel Code, dass ich das Problem nachstellen kann.
    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!
    anbei die komplette sub

    VB.NET-Quellcode

    1. Private Sub upsdruck()
    2. If CInt(Label24.Text) = 1 Then
    3. For Each item As String In ListBox7.Items
    4. PKIpaid = item
    5. url = "<<APIadresse UPS>>"
    6. Dim postAdress = New Uri(url)
    7. Dim p = New jspaidcheck_sender With {.package_id = CInt(PKIpaid)}
    8. Dim jstring = JsonConvert.SerializeObject(p, Formatting.Indented)
    9. json1 = My.Resources.token
    10. Dim request As HttpWebRequest = DirectCast(WebRequest.Create(postAdress), HttpWebRequest)
    11. request.Method = "GET"
    12. request.ContentType = "application/json"
    13. request.Accept = "application/json"
    14. request.Headers.Add(My.Resources.token)
    15. Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
    16. If (response.StatusCode = HttpStatusCode.OK) Then
    17. Using reader As New StreamReader(response.GetResponseStream())
    18. Dim rec As String
    19. rec = reader.ReadToEnd
    20. Dim PKI As jspaidchek_rec = JsonConvert.DeserializeObject(Of jspaidchek_rec)(rec)
    21. If PKI.is_paid = True Then
    22. ListBox6.Items.Add(PKI.package_id)
    23. Listbox8.Items.Add(PKI.package_id)
    24. ListBox5.Items.Add(PKI.package_id)
    25. For Each i As Integer In PKI.duplicate_ids
    26. ListBox6.Items.Add(i)
    27. Listbox8.Items.add(i)
    28. ListBox5.Items.Add(i)
    29. Next
    30. Else
    31. End If
    32. End Using
    33. Else
    34. MsgBox((response.StatusCode), CType("Verbindungsfehler", MsgBoxStyle), MsgBoxStyle.Critical)
    35. Timer1.Enabled = True
    36. ProgressBar1.Value = 0
    37. Exit For
    38. End If
    39. Next
    40. If ListBox6.Items.Count > 0 Then
    41. TrimListbox2()' sortieren und dublikate entfernen
    42. Listboxcheck2() ' abgleichen ob package id gleich der Listboxen fuer die labels sind
    43. For Each item As String In ListBox6.Items
    44. 'Dim p4 As System.IO.FileStream
    45. pkid = item
    46. p1 = "C:\Label-test"
    47. p2 = "label_" & pkid & ".png"
    48. p3 = p1 & "\" & p2
    49. pkid = item
    50. url = "<< API Adresse UPS für labelabruf>>"
    51. url2 = url & p2
    52. Dim authurl = "<<API Adresse fürUPS auth per token >>"
    53. s1 = "I:\Labels"
    54. p1 = "C:\Label-test"
    55. Dim di As New System.IO.DirectoryInfo(p1)
    56. If System.IO.Directory.Exists(p1) = False Then
    57. di.Create()
    58. End If
    59. p2 = "label_" & pkid & ".png"
    60. p3 = p1 & "\" & p2
    61. Dim prlab As String
    62. prlab = p3
    63. url2 = url & p2
    64. Dim postAdress = New Uri(CType(url, String))
    65. json1 = "<<UPS SandboxToken>>"
    66. Dim request As HttpWebRequest = DirectCast(WebRequest.Create(postAdress), HttpWebRequest)
    67. request.Method = "GET"
    68. request.ContentType = "application/json"
    69. request.Headers.Add(json1)
    70. Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
    71. Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
    72. If System.IO.File.Exists(p3) = False Then
    73. Dim img As Image = System.Drawing.Image.FromStream(response.GetResponseStream())
    74. img.Save(p3, Imaging.ImageFormat.Png)
    75. End If
    76. Next
    77. System.Threading.Thread.Sleep(500)
    78. For Each item As String In ListBox8.Items
    79. With PrintDocument1
    80. .PrinterSettings.PrinterName = "Labeldrucker"
    81. .Print()
    82. End With
    83. If System.IO.File.Exists(did) = True Then
    84. System.IO.File.Delete(did)
    85. End If
    86. Next
    87. End If
    88. Timer1.Enabled = True
    89. ProgressBar1.Value = 0
    90. listboxsauber()
    91. End If
    92. End Sub


    dazu kommt dann noch folgender abschnitt für Printpage:

    VB.NET-Quellcode

    1. Private Sub PrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim gr As Graphics = e.Graphics
    3. Dim oImage As Image = Image.FromFile(p3)
    4. gr.DrawImage(oImage, 0, 0, oImage.Width, oImage.Height)
    5. gr.Dispose()
    6. End Sub
    @Drachie Erstell ein abgespecktes Testprojekt, das den Effekt reproduziert und häng dies ohne bin- und obj-Verzeichnisse als ZIP an.
    Stell sicher, dass es compiliert.
    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!
    Evtl vorher noch das hier angucken: Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen
    und das hier: Visual Studio - Empfohlene Einstellungen

    Und evtl. solltest du deine Controls mal richtig benennen. Label24 / ListBox6 in nem Monat wenn du das Projekt nochmal öffnest ist
    Bahnhof angesagt weil du nicht mehr weißt was was ist.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    Evtl vorher noch das hier angucken: Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen
    und das hier: Visual Studio - Empfohlene Einstellungen

    Und evtl. solltest du deine Controls mal richtig benennen. Label24 / ListBox6 in nem Monat wenn du das Projekt nochmal öffnest ist
    Bahnhof angesagt weil du nicht mehr weißt was was ist.


    zu wedem Programm gibt es ein Pflichten und Lastenheft sowie eine dokumentation was wie heist und warum. von daher ist das wieder reinfinden in den code leicht.

    RodFromGermany schrieb:

    @Drachie Erstell ein abgespecktes Testprojekt, das den Effekt reproduziert und häng dies ohne bin- und obj-Verzeichnisse als ZIP an.
    Stell sicher, dass es compiliert.


    bin ich gerade bei.


    Steppenpferd schrieb:

    @Drachie zur Dimensionierung...
    schau dir mal bitte PrintDocument1.DefaultPageSettings > PaperSize usw. an
    und die Grafik mal direkt ins e.Graphics der PrintPage zeichnen...

    habe ich bereits.. das ausgabeformat der labels ist 10 x 15 cm. und das ist direkt am Labelprinter als feste vorlage definiert....

    Die grafik liegt als PNG datei vor vom Versandanbieter
    Ähmm keine Ahnung ob wir jetzt grade aneinander vorbei Reden, ich meine das in Etwa so:

    VB.NET-Quellcode

    1. Private Sub PrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim oImage As Image = Image.FromFile(p3)
    3. e.Graphics.DrawImage(oImage, 0, 0, oImage.Width, oImage.Height)
    4. End Sub

    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

    Steppenpferd schrieb:

    Ähmm keine Ahnung ob wir jetzt grade aneinander vorbei Reden, ich meine das in Etwa so:

    VB.NET-Quellcode

    1. Private Sub PrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim oImage As Image = Image.FromFile(p3)
    3. e.Graphics.DrawImage(oImage, 0, 0, oImage.Width, oImage.Height)
    4. End Sub



    Scherzkeks... das löst das problem nicht. da e.Graphics im meinen ocde nur verkürzt wird auf

    Quellcode

    1. Dim gr As Graphics = e.Graphics


    Der Ausdruck bleibt der gleiche wie weiter oben auf den 3. bild
    @Drachie Popste mal ein abgespecktes Projekt und ein solches Bild, das den Fehler reproduziert.
    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!
    anbei das ganze project mal als zip gepackt.

    die SAP datenbankanbindung habe ich raus editiert, sowie den API token
    Dateien
    • labels.zip

      (6,79 MB, 100 mal heruntergeladen, zuletzt: )
    Hier druckst Du dein Image in Originalgröße und diese überschreitet die Din A4 Papiergröße.

    Drachie schrieb:

    gr.DrawImage(oImage, 0, 0, oImage.Width, oImage.Height)


    In deinem Zip passt Du das Bild an die Papiergröße an und da funktioniert es doch auch mit dem Druck über die komplette Seite.

    VB.NET-Quellcode

    1. gr.DrawImage(oImage, 0, 0, 800, 1400)
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Drachie Wozu brauchst Du 9 Versionen der Newtonsoft.Json.dll?

    RodFromGermany schrieb:

    das den Fehler reproduziert.

    ;(
    Überzeuge Dich davon, dass ein abgespecktes Projekt den und nur den Effekt reproduziert.
    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!

    Steppenpferd schrieb:

    Hier druckst Du dein Image in Originalgröße und diese überschreitet die Din A4 Papiergröße.

    Drachie schrieb:

    gr.DrawImage(oImage, 0, 0, oImage.Width, oImage.Height)


    In deinem Zip passt Du das Bild an die Papiergröße an und da funktioniert es doch auch mit dem Druck über die komplette Seite.

    VB.NET-Quellcode

    1. gr.DrawImage(oImage, 0, 0, 800, 1400)


    Der Drucker hat keine D A4 seite. der Drucker kann nicht auf DIN A4 drucken da es ein GK420D ist. darauf können nur Labels mit den abmaßen 10 x 15 cm gedruckt werden!!!

    würde der drucker A4 drucken, so währe der ausdruck auch kompett zu sehen auf der seite.


    RodFromGermany schrieb:

    @Drachie Wozu brauchst Du 9 Versionen der Newtonsoft.Json.dll?

    RodFromGermany schrieb:

    das den Fehler reproduziert.
    vb-paradise.de/index.php/Attac…5508bff70e11a86796196c5d8 Überzeuge Dich davon, dass ein abgespecktes Projekt den und nur den Effekt reproduziert.
    Die 9 Json.dll files kommen vom Package das per nutshell installiert wurde. genutzt wird die DLL die 4.7.2 unterstütz.Die fehler mit der DB verbindung kommen dater, das ich die SAP Verbindungsdaten rausgenommen habe. habe ich aber auch beim Posten der zip file bekanntgegeben -.-
    nach langem hin und her mit e.Graphics... habe ich wie folgt gelöst damit die Labels richtig gedruckt werden mit hilfe des ImageMagick package:

    VB.NET-Quellcode

    1. Dim settings As New MagickReadSettings
    2. settings.Density = New Density(300, 300)
    3. Using img2 As MagickImageCollection = New MagickImageCollection(p3)
    4. img2.Read(p3, settings)
    5. img2.Write(p5)
    6. ListBox8.Items.Add(p5)
    7. End Using


    VB.NET-Quellcode

    1. ​For Each item As String In ListBox8.Items
    2. did = item
    3. printing = "C:\SumatraPDF\SumatraPDF.exe"
    4. Dim pr = New Process
    5. pr.StartInfo.FileName = printing
    6. pr.StartInfo.Arguments = "-silent -exit-on-print -zoom ""fit page"" -print-to ""Labeldrucker"" " & did
    7. pr.Start()
    8. pr.WaitForExit()
    9. If System.IO.File.Exists(did) = True Then
    10. System.IO.File.Delete(did)
    11. End If
    12. Next