Nichtdruckbarer Bereich Programmtechnisch ändern

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von vb6er.

    Nichtdruckbarer Bereich Programmtechnisch ändern

    Hallo Leute,

    ich habe ein hoffentlich kleines Problem.
    Ich habe nach der Anleitung von RodFromGermany das Drucken in meinem Programm etabliert.
    Dazu wird der Inhalt eines Datagridview ausgelesen und gedruckt.

    Das Problem was ich habe sind eigentlich nur noch die Druckereinstellungen. Diese kann ich natürlich über den PrintDialog ändern, allerdings soll es über das Programm erfolgen.

    Ich nutze einen Zebra-Etiketten-Drucker. Dieser hat Standardmäßig die Einstellung Breite 2,7 Höhe 5,08 und der Nichtdruckbarer Bereich ist 0,0,0,0.
    Wenn ich diesen Drucker allerdings über den Printdialog auswähle ( er ist nämlich nicht der Standarddrucker) ändert wer diese Einstellungen.
    Er läd dann eine falsche Größe und schreibt im Nichtdruckbaren Bereich Wert rein.

    Die Größe konnte ich mit:

    VB.NET-Quellcode

    1. Me.PrintDocument1.DefaultPageSettings.PaperSize = New System.Drawing.Printing.PaperSize("Benutzer", 106, 200)
    ändern.

    Jetzt weiß ich habe nicht wie ich den Nichtdruckbaren Bereich ändern kann. Weiß jemand rat? Ich nutzte VB.net und Visual Studio 2017.

    Vielen Dank und viele Grüße
    Philipp
    Hey,
    ohne deinen Programmcode zu kennen einfach mal ins blaue geschossen:

    Die Ränder deines PrintDocuments kannst du über folgendes abfragen,

    VB.NET-Quellcode

    1. Me.PrintDocument1.DefaultPageSettings.Bounds.Width
    2. Me.PrintDocument1.DefaultPageSettings.Bounds.Height


    Notfalls muss du dann die Skalierung deines Druckobjektes ändern, sofern möglich. Ohne deinen Programmcode gesehen zu haben, sehr schwierig einzuschätzen, weil ich keine Ahnung habe wie dein druckobjekt aussieht.

    Vielleicht verlinkst du einfach mal den vorangegangenen Thread.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Hallo Yanbel,

    vielen Dank für deine schnell Antwort. Leider erhalte ich damit nur die Breite und Höhe der Seite.


    Ich hoffe das klappt mit dem Bild. Die Einstellungen des Nichtdruckbaren Bereich möchte ich ändern.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PrintDocument2_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument2.PrintPage
    2. Dim g = e.Graphics
    3. 'g.DrawString(String.Format("Seite {0}", Me.pageNb + 1), New Font("arial", 20), Brushes.Black, New Point(10, 10))
    4. Dim rc = g.VisibleClipBounds ' der Druckbereich
    5. Dim Seitenzahlen As Integer = DataGridView1.RowCount - 2
    6. 'Dim txt = Me.RichTextBox1.Text ' brauchen wir noch öfter
    7. Dim ft = New Font("Arial", 11, FontStyle.Bold) 'NumericUpDown1.Value) ' der Druck-Font
    8. ' Ruft die Seitenränder für diese Seite ab oder legt diese fest.
    9. Dim margin = Me.PrintDocument2.DefaultPageSettings.Margins
    10. 'MsgBox(margin.Left)
    11. 'MsgBox(margin.Top)
    12. rc.Offset(2.7, 5.08) ' obere linke Ecke
    13. rc.Width -= (0) ' neue Breite
    14. rc.Height -= (0) ' neue Höhe
    15. 'g.DrawString(txt.Substring(Me.indexText), ft, Brushes.Black, rc)
    16. 'Dim page = Me.PrintDocument2.DefaultPageSettings.PaperSize
    17. 'MsgBox(page.Height)
    18. 'MsgBox(page.Width)
    19. 'page.Width = 106
    20. 'page.Height = 200
    21. 'Textaussehen
    22. Dim normalFont As New Font("Arial", 10, FontStyle.Bold) ' Font für Massentext
    23. Dim sNormal As String = "Hallo Welt, gestern standen wir am Abgrund," & "hute sind wir ein Schritt weiter!"
    24. Dim verticalFont As New Font("Arial", 8, FontStyle.Regular) 'Or FontStyle.Italic) ' Font für horizontaler Text
    25. Dim format As New StringFormat
    26. format.FormatFlags = StringFormatFlags.DirectionVertical
    27.  
    28. ' System.Drawing.StringFormat, das Formatierungsinformationen für die Zeichenfolge darstellt.
    29. Dim stringFormat As New StringFormat(StringFormatFlags.LineLimit) ' Bestimmung der Zeilenanzahl
    30. ' Anzahl der Zeichen in der Zeichenfolge, die auf einmal gedruckt wird
    31. ' Zielgröße, abhängig von Font und Rechteck
    32. Dim charactersFitted As Integer
    33. ' Anzahl der Textzeilen in der Zeichenfolge, wird hier nicht weiter verwendet
    34. 'Dim linesFilled As Integer
    35. ' Bestimmung der Anzahl der druckbaren Zeichen
    36. 'e.Graphics.MeasureString(txt.Substring(Me.indexText), ft, rc.Size, stringFormat, charactersFitted, linesFilled)
    37. ' Druck des Textes, wegen StringFormatFlags.LineLimit werden keine (höhen-)halben Zeilen gedruckt
    38. 'e.Graphics.DrawString(txt.Substring(Me.indexText), ft, Brushes.Black, rc, stringFormat)
    39. Dim varProbennummer, varParameter, varBearbeiter, varProjekt As String
    40. Dim varRows As Integer
    41. varRows = DataGridView1.RowCount - 2
    42.  
    43.  
    44. 'For i = 0 To varRows
    45. varProbennummer = DataGridView1.Rows(i).Cells(0).Value.ToString
    46. varParameter = DataGridView1.Rows(i).Cells(1).Value.ToString
    47. varBearbeiter = DataGridView1.Rows(i).Cells(2).Value.ToString
    48. varProjekt = DataGridView1.Rows(i).Cells(3).Value.ToString
    49. e.Graphics.DrawString("PN-Nr.:", verticalFont, Brushes.Black, 5, 50, format)
    50. e.Graphics.DrawString("Parameter:", verticalFont, Brushes.Black, 25, 50, format)
    51. e.Graphics.DrawString("Bearbeiter:", verticalFont, Brushes.Black, 45, 50, format)
    52. e.Graphics.DrawString("Projekt:", verticalFont, Brushes.Black, 65, 50, format)
    53. e.Graphics.DrawString(varParameter, verticalFont, Brushes.Black, 25, 110, format)
    54. e.Graphics.DrawString(varBearbeiter, verticalFont, Brushes.Black, 45, 110, format)
    55. e.Graphics.DrawString(varProjekt, verticalFont, Brushes.Black, 65, 90, format)
    56. e.Graphics.DrawString(varProbennummer, normalFont, Brushes.Black, 5, 90, format)
    57. e.Graphics.DrawString(varProbennummer, ft, Brushes.Black, 1, 15, stringFormat)
    58. ' Festlegen der Text-Startposition der nächsten Seite
    59. ' Me.indexText += charactersFitted
    60. ' bestimmen, ob es überhaupt weitere Seiten gibt
    61. '#######
    62. 'Me.pageNb += 1
    63. 'e.HasMorePages = Me.pageNb < varRows + 2
    64. ' die nächste Seitennummer
    65. 'Me.pageNb += 1
    66. e.HasMorePages = Seitenzahl < Seitenzahlen
    67. i += 1
    68. Seitenzahl += 1



    Der Code ist noch wild deshalb wollte ich ihn erst nicht Posten. Aber wenn euch das hilft.

    Gruß Philipp

    *überlangen Code in Spoiler gepackt* ~NoFear23m

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

    Der Drucker druckt doch eine bestimmte Höhe und Breite. Von daher brauchst du dir doch nur für dein Graphics einen Umrechnungsfaktor basteln und das Graphics damit skalieren:

    VB.NET-Quellcode

    1. FaktorX = sender.DefaultPageSettings.Bounds.width / SeitenhoeheDrucker
    2. FaktorY = sender.DefaultPageSettings.Bounds.height / SeitenbreiteDrucker
    3. NormalFont= New Font(NormalFont.FontName, NormalFont.Fontsize / 4) * FaktorY , NormalFont.Fontstyle)
    4. VerticalFont= New Font(VerticalFont.FontName, VerticalFont.Fontsize / 4) * FaktorY , VerticalFont.Fontstyle)


    Und die Seitenhoehe des Druckers kannst du (falls er die nicht freiwillig rausrückt) über das Umrechnungsverhältnis der Seitelänge des Ausrucks in cm und die DPI-Anzahl ermitteln.

    Ich hoffe ich habe dein Problem richtig verstanden.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Es neuer Versuch mit dem Bild.
    Auf dem Link siehst du die Druckoptionen.
    guide.jtl-software.de/uploads/…instellungen-zebra-01.jpg
    Mein Problem sind die unteren Werte.

    Mein Ausdruck sieht Optisch perfekt aus wenn ich die vier Werte manuell auf 0 setzte.
    Sind dort Werte drin, druckt der nicht das gesamte Etikett. Er lässt dann die Abstände die dort eingetragen sind unbedruckt.
    Nehmen wir an die Breite vom Etikett ist 5 cm und der Wert für Links im Nichtdruckbaren Bereich ist 1 cm.
    Dann würde der erste cm vom Ausdruck nicht gedruckt.
    @vb6er
    Erstmals Hallo und Willkommen im Forum, dir wird ja bereits fleißig geholfen.
    Mach uns nur bitte einen gefallen und nutze für Bilder die Forumsinterne Funktion für Bilderupload (Erweiterte Antwort -> Dateianhänge). Auch diese kann man dann nach dem Upload im Text einbetten.
    So ist gesichert das jemand der hier in 2 Jahren vorbeikommt dieses Bild auch noch sehen kann und versteht um welches Problem es ging. Danke im Voraus

    Ansonsten weiterhin viel Spaß beim programmieren und schöne Stunden im Forum.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ganz kurz: Vielleicht liegt die (fehlerhafte ?) Festlegung des nicht-druckbaren Bereichs allein schon daran, was Du in Post#3 geschrieben hast:

    VB.NET-Quellcode

    1. rc.Offset(2.7, 5.08) ' obere linke Ecke
    2. rc.Width -= (0) ' neue Breite
    3. rc.Height -= (0) ' neue Höhe

    Zeile#2 und #3 sind falsch! Du reduzierst darin die Breite/Höhe um null Pixel. Die Minuszeichen vor dem = müssen raus, sonst passiert da gar nix.
    Zeile#1 legt doch offensichtlich auch schon einen Seitenrand fest. Sicher, dass das so richtig ist?
    Bei welchem Seiteneinstellungsparameter im Code weißt Du denn, dass er falsch 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.
    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!
    Sorry für die späte Antwort. Ich konnte heute aber erst wieder am Code arbeiten und eure Lösungen/Tipps ausprobieren.

    Ich weiß nicht ob ich zu doof bin oder ob es einfach nicht geht. Ich tippe mal auf erstes.

    Wenn ich mein Programm starte und den Drucker auswähle läd er ihn mit diesen Einstellungen. . Die Breite, Höhe und der Nichtdruckbare Bereich ist falsch.
    Die Breite und Höhe kann ich auch im Programm ändern. In der Druckvorschau sieht das Etikett dann genauso aus wie ich es haben möchte.

    Öffne ich die Druckeinstellungen erneut sieht man auch das die Breite und Höhe geändert wurde.
    Drucke ich das Etikett jetzt auf dem Zebradrucker sieht der Ausdruck anders aus. Er druckt nämlich nur einen schmalen Streifen vom Etikett.

    Ich habe es mit den Seitenränder Einstellungen von @RodFromGermany versucht aber ich weiß nicht was ich ändern muss, damit es klappt.


    Mit

    VB.NET-Quellcode

    1. Me.PrintDocument2.DefaultPageSettings.PrintableArea

    Kann ich mir ja den Druckbereich anzeigen lassen.
    Die Werte vor den manuellen ändern in der Druckeinstellung sind:
    Left = 39,3333
    Right = 66,3333
    Top = 71
    Bottom = 200
    Nach dem manuellen ändern sind die Werte:
    Left = 0
    Right = 106
    Top = 0
    Bottom = 200

    Jetzt weiß ich ja, wie ich die Werte ändern muss aber wie geht das?

    Ich habe es mit

    VB.NET-Quellcode

    1. Dim rc1 As RectangleF
    2. rc1 = New RectangleF(0, 0, 106, 200)
    versucht. Aber dann wird nicht mehr ein Etikett bedruckt sondern 1,5 und es wird ebenfalls nur ein Streifen gedruckt.

    Ich bin wirklich ratlos. Manuell klappt alles, aber niemand will jedes mal die Einstellungen ändern. ;(
    @vb6er Du hast Controls für einen nicht druckbaren Bereich.
    Setze einen Haltepunkt nach dem Aufruf dieses Dialogs. Gugst Du ggf. Debuggen, Fehler finden und beseitigen
    Verändere diese Werte, sieh Dir im Haltepunkt an, was da an geänderten Properties rauskommt.
    Stell sicher, dass das PrintDocument mit diesen Werten "gefüttert wird".
    Überzeuge Dich, dass da am Output tatsächlich was passiert.
    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!

    vb6er schrieb:

    PrintableArea ist ja Readonly.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. ' Seitenränder festlegen
    4. 'Using dlg As New PageSetupDialog
    5. ' dlg.Document = Me.PrintDocument1
    6. ' If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
    7. ' Return
    8. ' End If
    9. 'End Using
    10. ' Druckvorschau
    11. Using dlg As New PrintPreviewDialog
    12. dlg.Document = Me.PrintDocument1
    13. dlg.ShowDialog()
    14. End Using
    15. End Sub
    16. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    17. Dim g = e.Graphics
    18. Dim rc = g.VisibleClipBounds ' der Druckbereich
    19. ' Seitenränder für diese Seite entsprechend dem PagesetupDialog festlegen
    20. Dim margin = Me.PrintDocument1.DefaultPageSettings.Margins
    21. '###########################################################
    22. '###########################################################
    23. margin.Top = 400 ' Das hier
    24. '###########################################################
    25. '###########################################################
    26. rc.Offset(margin.Left, margin.Top) ' obere linke Ecke
    27. rc.Width -= (margin.Left + margin.Right) ' neue Breite
    28. rc.Height -= (margin.Top + margin.Bottom) ' neue Höhe
    29. ' das Um-Rechteck zeichnen
    30. g.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    31. ' den Texz ausgeben
    32. Dim ft = New Font("Arial", 12) ' der Druck-Font
    33. g.DrawString("löhjjklöhkljh", ft, Brushes.Black, rc)
    34. End Sub
    35. End Class
    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!

    vb6er schrieb:

    Das sind doch zwei unterschiedliche Dinge.
    Hast Du meinen Code ausprobiert :?:
    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!
    Ja habe ich gemacht. Die Änderung wird in der Druckvorschau auch sichtbar.

    Mir ist aber gerade eine andere Idee gekommen. Ich laden den entsprechenden Drucker schon beim Laden der Form. Dann übernimmt er die Standardeinstellungen des Druckers und ich brauche die nicht ändern.

    Ich werde das erste Testergebnis noch mal prüfen und dann ist das Problem hoffentlich gelöst.