Druckbereich erweitern

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Skipper.

    Druckbereich erweitern

    Liebes Team,
    ich möchte eine Tabelle mit einer Fusszeile versehen. Mein Problem ist, das ich in den unteren 18mm nicht drucken kann. Mein kurzes Testprogramm:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports System.Drawing.Printing
    3. Imports System.Drawing
    4. Imports System.IO
    5. Public Class printtest
    6. Public printFont As Font
    7. Dim pd As New PrintDocument()
    8. Public Sub PrintXL(ByVal tIn As DataTable)
    9. pd.PrintController = New StandardPrintController
    10. pd.OriginAtMargins = True
    11. pd.DefaultPageSettings.Margins = New Margins(100, 20, 10, 20)
    12. ' pd.DefaultPageSettings.PaperSize = New PaperSize("Test", 650, 1300)
    13. AddHandler pd.PrintPage, AddressOf Me.pd_PrintPage
    14. pd.Print()
    15. End Sub
    16. Private Sub pd_PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
    17. Dim linesPerPage As Single = 0
    18. Dim yPos As Single = 0
    19. Dim topMargin As Single = ev.MarginBounds.Top
    20. Dim zeile As Integer = 0
    21. printFont = New Font("Arial", 10)
    22. linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)
    23. For i = 1 To 100 Step 1
    24. zeile += 1
    25. yPos = topMargin + zeile * printFont.GetHeight(ev.Graphics)
    26. ev.Graphics.DrawString(i, printFont, Brushes.Black, 280, yPos, New StringFormat())
    27. If i = 1 Then ev.Graphics.DrawString(linesPerPage, printFont, Brushes.Black, 180, yPos, New StringFormat())
    28. Next
    29. End Sub
    30. End Class


    Das Programm druckt in einen PDF-Drucker (standard), aber nur bis 66, von 67 nut die ober Kante. Gewünscht wäre bis 70.

    Danke für Hilfe
    Stefan

    *Topic verschoben, BBCode eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Skipper Willkommen im Forum.
    Gugst Du Drucken mehrseitiger Dokumente
    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!
    @Skipper Bei mir schon:

    Erstell ein neues WinForm-Projekt.
    Füge der zwei Button hinzu.
    Kopiere den kompletten Code vom Link aus Post #2 in die Zwischenablage.
    Ersetze den Form1-Code Deines eben erstellten nagelneuen Projekts durch den Inhalt der Zwischenablage.
    Starte das Projekt.
    Drück auf Button2.
    Gebe für den unteren Rand den Wert 0 ein.
    ====
    Verstehe, was da passiert ist.
    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 habe folgendes kopiert und bei A4 Hochformat Bottom = 0 eingegeben

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    ' Seitenränder festlegen
    Using dlg As New PageSetupDialog
    dlg.Document = Me.PrintDocument1
    If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
    Return
    End If
    End Using
    ' Druckvorschau
    ' Using dlg As New PrintPreviewDialog
    'dlg.Document = Me.PrintDocument1
    ' dlg.ShowDialog()
    ' End Using
    Dim txt = "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern. "
    For i = 1 To 100
    Me.PrintText &= i.ToString + " " + txt
    Next
    AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintDocument1_PrintPage
    PrintDocument1.Print()
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs)
    Dim g = e.Graphics
    Dim rc = g.VisibleClipBounds ' der Druckbereich
    ' Seitenränder für diese Seite entsprechend dem PagesetupDialog festlegen
    Dim margin = Me.PrintDocument1.DefaultPageSettings.Margins
    rc.Offset(margin.Left, margin.Top) ' obere linke Ecke
    rc.Width -= (margin.Left + margin.Right) ' neue Breite
    rc.Height -= (margin.Top + margin.Bottom) ' neue Höhe
    ' das Um-Rechteck zeichnen
    g.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    ' den Texz ausgeben
    Dim ft = New Font("Arial", 12) ' der Druck-Font
    g.DrawString(Me.PrintText, ft, Brushes.Black, rc)
    End Sub
    Ich glaube zu verstehen was da passiert.
    Margin bekommt die Werte 39,39,39,0 so weit richtig. Der Ausdruck bleibt jedoch bei i=65 stehen, d.h. der text und der Rahmen haben 18mm Abstand von unterer Papierkante.

    Mein bestreben ist den Druck zu automatisieren, ohne dlg.showdialog. Gibt es dazu eine Lösung? Zur Not geht es auch mit, aber die letzte Zeile sollte ca 5 mm von der Unterkante sein.
    LG Stefan
    @Skipper Fang an und formatiere Deinen Code so, dass man ihn auch als Code lesen kann.
    Also:
    Codse markieren und auf den VB.NET-Button klicken, editiere Deine obigen Posts entsprechend.

    =====
    Bei mir geht das:
    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. Option Explicit On
    2. Imports System.Drawing.Printing
    3. Imports System.Drawing
    4. Imports System.IO
    5. Public Class Form1
    6. Private pageNb As Integer = 0 ' aktuelle Seitennummer
    7. Private indexText As Integer = 0 ' vorbereiteter Text
    8. Private PrintText As String
    9. Dim PrintDocument1 As New PrintDocument
    10. Private Sub Form1_Load(sender As Object, e As EventArgs)
    11. ' den Drucktext aufbauen
    12. End Sub
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. ' Drucker und Anzahl der Kopien festlegen
    15. Using dlg As New PrintDialog
    16. dlg.Document = Me.PrintDocument1
    17. dlg.ShowDialog()
    18. End Using
    19. End Sub
    20. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    21. ' Seitenränder festlegen
    22. Using dlg As New PageSetupDialog
    23. dlg.Document = Me.PrintDocument1
    24. If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
    25. Return
    26. End If
    27. End Using
    28. ' Druckvorschau
    29. ' Using dlg As New PrintPreviewDialog
    30. 'dlg.Document = Me.PrintDocument1
    31. ' dlg.ShowDialog()
    32. ' End Using
    33. Dim txt = "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern. "
    34. For i = 1 To 100
    35. Me.PrintText &= i.ToString + " " + txt
    36. Next
    37. AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintDocument1_PrintPage
    38. PrintDocument1.Print()
    39. End Sub
    40. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs)
    41. Dim g = e.Graphics
    42. Dim rc = g.VisibleClipBounds ' der Druckbereich
    43. ' Seitenränder für diese Seite entsprechend dem PagesetupDialog festlegen
    44. Dim margin = Me.PrintDocument1.DefaultPageSettings.Margins
    45. rc.Offset(margin.Left, margin.Top) ' obere linke Ecke
    46. rc.Width -= (margin.Left + margin.Right) ' neue Breite
    47. rc.Height -= (margin.Top + margin.Bottom) ' neue Höhe
    48. ' das Um-Rechteck zeichnen
    49. g.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    50. ' den Texz ausgeben
    51. Dim ft = New Font("Arial", 12) ' der Druck-Font
    52. g.DrawString(Me.PrintText, ft, Brushes.Black, rc)
    53. End Sub
    54. End Class

    Skipper schrieb:

    Wie kann ich Dir mein pdf anhängen?
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Vielleicht sollten wir mal die Unterschiede herausarbeiten.
    Ich habe Win10-64, Microsoft Pront to PDF, ich denke mal, dass da der Unterschied liegt.
    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!