Schlieren beim pdf-Druck

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Schlieren beim pdf-Druck

    Moin moin

    Ich habe hier ein "Problem" beim Ausdruck meines Chart, wenn ich den Hintergrund farbig gestalte.
    Bei weißem Hintergrund fällt es kaum auf, das da überall solche Schlieren sind wie bei einem schlecht komprimiertem jpg-Bild.
    Als Druckertreiber habe ich den ​PDF-XChange Light installiert.

    Gibt es da irgendetwas zu verbessern, so das der PDf-Druck besser wird?

    Die Methode wie ich das Chart drucke. Die Methode für die DGV lasse ich hier mal weg.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Printset()
    2. Me.WindowState = FormWindowState.Normal
    3. Me.Height = 650 : Me.Width = 1150
    4. ' Öffne den Druckdialog
    5. Dim printDialog As New PrintDialog()
    6. ' Überprüfe, ob der Benutzer einen Drucker auswählt, bevor der Druck fortgesetzt wird
    7. If printDialog.ShowDialog() = DialogResult.OK Then
    8. ' Setze den ausgewählten Drucker für das Druckdokument
    9. PrintDocMeasureddata.PrinterSettings = printDialog.PrinterSettings
    10. ' Setze das Seitenformat auf Querformat
    11. PrintDocMeasureddata.DefaultPageSettings.Landscape = True
    12. ' Setze den Dokumentnamen
    13. PrintDocMeasureddata.DocumentName = $"Daten{dataManager.CurDatum.ToString("MMMM yyyy")}"
    14. ' Drucke direkt
    15. currentPageIndex = 0 ' Setze den Index zurück, um erneutes Drucken zu ermöglichen
    16. currentTabPageIndex = 0
    17. PrintDocMeasureddata.Print()
    18. End If
    19. End Sub
    20. Private Sub PrintDocMeasureddata_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocMeasureddata.PrintPage
    21. Dim g = e.Graphics
    22. Dim font As New Font("Segoe UI", 12, FontStyle.Bold)
    23. Dim dgvList As New List(Of DataGridView) From {DgvStation1, DgvStation2, DgvStation3}
    24. Dim chartList As New List(Of Chart) From {ChartStation1, ChartStation2, ChartStation3}
    25. If currentPageIndex < dgvList.Count + chartList.Count Then
    26. If currentPageIndex < dgvList.Count Then
    27. Dim currentDGV As DataGridView = dgvList(currentPageIndex)
    28. ' Titelzeile für DataGridView
    29. Dim tabPageIndex As Integer = currentPageIndex + 1
    30. Dim TabData As String = ""
    31. Select Case tabPageIndex
    32. Case 1
    33. TabData = $"Messdaten {ClsSettings.Station1}"
    34. Case 2
    35. TabData = $"Messdaten {ClsSettings.Station2}"
    36. Case 3
    37. TabData = $"Messdaten {ClsSettings.Station3}"
    38. End Select
    39. g.DrawString(String.Format($"Daten {dataManager.CurDatum.ToString("MMMM yyyy")} - {TabData} - {LblAvrTemp} / {LblAvrHumini}"), font, Brushes.Blue, New Point(50, 30))
    40. ' Drucke DGV-Inhalte
    41. PrintDGV(currentDGV, g)
    42. Else
    43. Dim currentChart As Chart = chartList(currentPageIndex - dgvList.Count)
    44. ' Titelzeile für Chart
    45. Dim tabPageIndex As Integer = currentPageIndex + 1 - dgvList.Count + 3 ' Um auf die Indizes 4, 5, 6 zuzugreifen
    46. Dim TabGraph As String = ""
    47. Select Case tabPageIndex
    48. Case 4
    49. TabGraph = $"Diagramm {ClsSettings.Station1}"
    50. Case 5
    51. TabGraph = $"Diagramm {ClsSettings.Station2}"
    52. Case 6
    53. TabGraph = $"Diagramm {ClsSettings.Station3}"
    54. End Select
    55. g.DrawString(String.Format($"Daten {dataManager.CurDatum.ToString("MMMM yyyy")} - {TabGraph}"), font, Brushes.Green, New Point(50, 30))
    56. ' Drucke Chart-Inhalte
    57. PrintChart(currentChart, g, e)
    58. End If
    59. ' Erhöhe den Index für die nächste Seite
    60. currentPageIndex += 1
    61. ' Erhöhe den Index für die nächste TabPage
    62. currentTabPageIndex += 1
    63. ' Setze HasMorePages auf True, wenn es noch mehr Seiten gibt
    64. If Dummy AndAlso currentPageIndex = 3 Then
    65. e.HasMorePages = False ' Beende den Druck nach der dritten Seite
    66. Else
    67. e.HasMorePages = currentPageIndex < dgvList.Count + chartList.Count
    68. End If
    69. ' Wechsel zur nächsten TabPage
    70. If currentTabPageIndex < TabControl.TabCount Then
    71. TabControl.SelectedIndex = currentTabPageIndex
    72. End If
    73. Else
    74. ' Es gibt keine weiteren Seiten
    75. e.HasMorePages = False
    76. ' Setze den Index zurück, damit der Druck bei Bedarf erneut durchgeführt werden kann
    77. currentPageIndex = 0
    78. currentTabPageIndex = 0
    79. TabControl.SelectedIndex = 0
    80. End If
    81. End Sub
    82. Private Sub PrintChart(curChart As Chart, g As Graphics, e As PrintPageEventArgs)
    83. Dim chartWidth As Integer = CInt(e.PageSettings.PrintableArea.Width * 1.3)
    84. Dim chartHeight As Integer = 700 'CInt(chartWidth * 0.9 / 2)
    85. Dim yPos As Single = 55
    86. ' Draw the chart
    87. Using chartImage As New Bitmap(curChart.Width, curChart.Height)
    88. curChart.DrawToBitmap(chartImage, New Rectangle(0, 0, curChart.Width, curChart.Height))
    89. g.DrawImage(chartImage, e.MarginBounds.Left - 80, yPos, chartWidth, chartHeight)
    90. End Using
    91. End Sub

    Bilder
    • druck1.jpg

      322,06 kB, 1.032×584, 272 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Warum hast du extra einen PDF-Druckertreiber installiert? Der Hauseigene von MS tut doch gute Dienste?

    Ich glaube die Schlieren kommen vom Stretchen, oder aber von Bildkomprimierung. Du erstellst ja das Chartbild in der Größe vom Control(Chart) selbst, aber in Zeile 99 malst du es in einer anderen Größe.

    Aber du musst sehr reich sein, wenn du es dir erlaubst ganzseitig farbig zu drucken. Auf bereits gefärbtes Papier zu drucken kommt sicher deutlich günstiger.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @DTF

    Ich habe Win7 64Bit das ist noch kein Hauseigener PDF-Treiber dabei :(

    Aber du musst sehr reich sein,
    :D

    Ich habe es nun anders gelöst.

    In der Monitoransicht habe ich den Hintergrund und die Linien andersfarbig und bei Ausdruck wieder "normal" auf DIN A4 Querformat

    VB.NET-Quellcode

    1. Private Sub SetChartColors(ByVal tempColor As Color, ByVal huminiColor As Color, ByVal backColor As Color, ByVal legendBackColor As Color)
    2. CalculateDatas.TempColor = tempColor ' Farben für die Charts
    3. CalculateDatas.HuminiColor = huminiColor ' Farben für die Charts
    4. ChartStation1.BackColor = backColor
    5. ChartStation1.ChartAreas(0).BackColor = backColor ' Hintergrundfarbe des Diagrammbereichs
    6. ChartStation1.Legends(0).BackColor = legendBackColor ' Hintergrundfarbe der Legende
    7. ChartStation2.BackColor = backColor
    8. ChartStation2.ChartAreas(0).BackColor = backColor ' Hintergrundfarbe des Diagrammbereichs
    9. ChartStation2.Legends(0).BackColor = legendBackColor ' Hintergrundfarbe der Legende
    10. ChartStation3.BackColor = backColor
    11. ChartStation3.ChartAreas(0).BackColor = backColor ' Hintergrundfarbe des Diagrammbereichs
    12. ChartStation3.Legends(0).BackColor = legendBackColor ' Hintergrundfarbe der Legende
    13. End Sub
    14. Private Sub SetChartColors()
    15. SetChartColors(Color.Gold, Color.Cyan, Color.SteelBlue, Color.SteelBlue)
    16. End Sub
    17. Private Sub SetChartColorsPrint()
    18. SetChartColors(Color.Red, Color.Blue, Color.White, Color.White)
    19. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Ich habe Win7 64Bit


    Bei Amazon bekommt man eine Windows10 Pro OEM Version für rund 30€. Als ich meinen aktuellen PC gebaut hab(wenige Wochen her), hab ich so eine gekauft und kann deswegen auch Win11 auf dem neuen Rechner nutzen. Einziger Nachteil dieser OEM-Versionen, gibt man den Key ein, ist das wie diese boardgebundene digitale Lizenz, also wird im BIOS was eingetragen und man kann diese Lizenz nicht umziehen(Rechner wechseln). Hat aber auch einen Vorteil, man braucht den Key nicht erneut eingeben zum aktivieren wenn man Windows neu aufspielt, und Win11 Pro für so ein Paar pennies lohnt sich schon.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    @Amelie Ich kann im Bild nix erkennen.
    Reproduzieren kann ich das nicht, da ich mit Win10 und "MS to PDF" drucke.
    Vielleicht druckst Du mal auf weißem Hintergrund.
    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!
    Ich glaube, dass mit Schlieren die Bildkomprimierunschönheiten gemeint sind. JPG in geringer Qualität eben.
    Bilder
    • Schlieren.png

      98,16 kB, 400×493, 231 mal angesehen
    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.

    VaporiZed schrieb:

    Bildkomprimierunschönheiten
    aber nicht, wenn das Bild selbst gemalt wird.
    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!
    @VaporiZed

    Genau diese Schlieren in den Linien und in der Legende meinte ich.
    Die sind schon auf dem erzeugtem PDF-File zu sehen, wenn ich den Hintergrund Blau einfärbe.

    Liegt das am Treiber oder am Code oder woran?

    Mich interessiert das nun mal pauschal.
    Für mein Programm habe ich es nun so gelöst, das auf dem Monitor die Charts mit blauem Hintergrund angezeigt werden, aber im Druck mit weißem Hintergrund.
    Das ist eine akzeptable Lösung.
    Bei der Legende sind zwar immer noch kleine Schlieren zu sehen, aber nicht so schlimm als bei blau. Siehe Bild2
    Bilder
    • druck2.jpg

      81,57 kB, 485×364, 242 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Schau mal ob du bei deinem PDF-Druckertreiber Einstellmöglichkeiten hast und was für welche. Es wird ja nur eine Datei in eine Datei eingebettet(wird das Bild automatisch komprimiert?), evtl. einfach mal das Chartbild mit Image.Save als PNG speichern und mal nur das PNG als PDF drucken zum vergleichen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @Amelie Wenn Du Glück hast, lässt sich für deinen PDF-Drucker, die JPEG-Kompression einstellen. Auszug aus Google:

    PDF-XChange Standard
    Move to the Control Panel.
    Click Devices and Printers.
    Right-click PDF-XChange Standard and select Printing preferences. The Printing preferences dialog box will open.
    Click the Compression tab and reduce the JPEG quality to 50%:

    Du müsstest natürlich die JPEG-Qualität, wenn es beim ​PDF-XChange Light auch solche Einstellungen gibt, erhöhen was im Endeffekt auch größere PDF-Dateien erzeugt. Evtl. werden Dir auch andere Kompressionsmodi vorgeschlagen und da müsste man halt experimentieren welche Einstellung das beste Ergebnis erzeugt. JPEG ist nunmal ein verlustbehaftetes Verfahren und da kommt es nun mal zur Bildung von Artefakten je nach Kompressionsqualität.
    Mfg -Franky-
    @Amelie Sieh Dir mal die Methode Control.DrawToBitmap(Bitmap, Rectangle) an und wende sie auf Dein Chart an:
    learn.microsoft.com/en-us/dotn…map?view=netframework-4.8
    Wenn Du das richtig skalierst, sollten die Schlieren verschwinden.
    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!
    Macht Amelie bereits in Zeile 98. @Amelie Ist dir die Property Control.ClientRectangle bekannt?
    curChart.DrawToBitmap(chartImage, curChart.ClientRectangle)
    So brauchste kein Rectangle zu erzeugenm, ist ja bereits ein passendes bekannt.(Huch, da wird die Position nicht passen)

    Erscheinen diese Schlieren auch, wenn du das Chart 1:1 malst? Weil du ja im ersten Code in Zeile 99 wie schon gesagt das erzeugte Chart-Bild gestretcht malst.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    @DTF
    ​Erscheinen diese Schlieren auch...

    Ja aber deutlich weniger!

    @-Franky-
    Leider finde ich solche Einstellungen beim Druckertreiber nicht.

    @RodFromGermany
    ​Wenn Du das richtig skalierst,

    Ich versuche das mal mit den Skalierungen.
    Ist nicht so einfach, weil ich mit einem Mal drei (3) DGV und drei (3) Charts ausdrucken lassen möchte.

    ---
    So wie ich es im Moment habe ist es eigentlich OK. Aber die "Verbesserungen" mit den Skalierungen versuche ich mal.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Leider finde ich solche Einstellungen beim Druckertreiber nicht.
    Durchaus möglich das es diese Einstellung in der Light-Version vom PDF-XChange-Drucker nicht gibt. Ich hatte unter Win7 den Bullzip-PDF Drucker im Einsatz und da konnte man für PDF die JPEG-Kompression für Bilder auf Flat-Kompression umstellen. Letztere war dann eine verlustfreie Kompression.
    Mfg -Franky-
    @-Franky-
    Der Bullzip-Pdf ist zwar etwas besser aber bringt nicht wirklich viel. Danke trotzdem.

    Meine Lösung ist ja nun OK.
    Tüftel gerade an etwas anderen bzgl der Charts.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: