none
Drucken über mehrere Seiten RRS feed

  • Frage

  • Guten Abend an alle.

    Ich habe das Problem, dass es mir nicht gelingt, über mehrere Seiten zu drucken.

    In einer Datenbank habe ich eine Tabelle mit "Kopfdaten" und
                                              eine Tabelle mit "Objektdaten" gespeichert.

    Die Objektdaten könne über mehrere logische Seiten verteilt sein.
    Das Speichern, laden, verändern und wieder speichern funktioniert problemlos.
    Die Inhalte dieser Tabellen sollen jetzt gedruckt werden. Dies macht mit keine
    Schwierigkeiten, solange ich nur 1 Seite drucken möchte.

    Den Druck über mehrere Seiten versuche ich mit <e.hasmorepages> zu steuern.
    Aber, wie auch immer ich vorgehe, der Ausdruck erfolgt immer nur auf der ersten Seite, so dass
    ggf. alle zu druckenden Seiten übereinander auf Seite 1 gedruckt werden.

    Mittlerweile fürchte ich, einen grundsätzlichen Fehler gemacht zu haben, den ich
    selbst einfach nicht erkenne.

    Unten habe ich den Code beigefügt.

    Es wäre super, wenn jemand mal drüber schauen würde. Evtl. kann  mir
    ja geholfen werden.

    Besten Dank schon mal vorweg und schöne Grüße

    Herbert Brenner  

    '--------------------------------------------------------------------
    '--------------------------------------------------------------------

    Imports System.Drawing.Printing

    Module Projekt_Drucken
        Private Kopfdaten_Dokument As PrintDocument
        Private Seitennummer As Integer
        Private Seitenzähler As Integer
        Private Zeilenhöhe As Single
        Private Spalte As Single
        Private Zeile As Single
        Private Druckposition As Integer
        '-----------------------------------------------------------
        'Kopfdaten drucken
        '-----------------------------------------------------------
        '-----------------------------------------------------------
        'Das Projekt drucken
        '-----------------------------------------------------------
        Public Sub Die_Projektdaten_Drucken(ByVal sender As Object, ByVal e As EventArgs)
            '--------------------------------------------------
            '--------------------------------------------------
            '--------------------------------------------------
            ' Das Druckdokument erzeugen
            '--------------------------------------------------
            '--------------------------------------------------
            '--------------------------------------------------
            '--------------------------------------------------
            'Das Deckblatt mir den Projektkopfdaten
            '--------------------------------------------------
            ' Benutzerdefiniertes Dokument erstellen.
            Dim Druckdokument As New PrintDocument()
            AddHandler Druckdokument.PrintPage, AddressOf Das_Projekt_jetzt_drucken
            ' Dem Benutzer erlauben, Drucker und Einstellungen zu ändern.
            Dim Druckereinstellungen As New PrintDialog()
            Druckereinstellungen.Document = Druckdokument
            Dim Result As DialogResult = Druckereinstellungen.ShowDialog()
            If Result = DialogResult.OK Then
                Druckdokument.Print()
            End If
        End Sub
        Private Sub Das_Projekt_jetzt_drucken(ByVal sender As Object, ByVal e As PrintPageEventArgs)
            'Das Dokument ermitteln, dass das Ereignis auslöste.
            Dim Doc As PrintDocument = CType(sender, PrintDocument)
            'Zeilenhöhe ermitteln und einstellen
            Zeilenhöhe = Arial12.GetHeight(e.Graphics) * 2
            'Variablen für die aktuelle Position bestimmen.
            Dim x As Single = e.MarginBounds.Left
            Dim y As Single = e.MarginBounds.Top
            Spalte = e.MarginBounds.Left
            Zeile = e.MarginBounds.Top
            ' ---> Vergleichsvariable ---> bestimmen (Zur Entscheidung, ob alle Seiten gedruckt wurden)
            Dim Lfd_Seitennr As Integer
            Dim Gesamtzahl_der_Seiten
            ' ---> Vergleichsgröße ---> Gesamtzahl der zu druckenden Seiten
            '                           Dieser Wert wird der Datenbank entnommen (Kopf_AnzahlSeiten)
            '                           Erhöhing um 1, weil Die Kopfdaten (das Deckblatt) sonst nicht berücksichtigt werden.
            Gesamtzahl_der_Seiten = Kopf_AnzahlSeiten + 1
            '
            'Die erste Seite drucken (Deckblatt)
            '
            e.Graphics.DrawString("Kopfdaten zum Projekt: " & Kopf_Projektkennung, Arial12, Brushes.Black, Spalte, Zeile)
            e.Graphics.DrawString("Seite: " & Seitennummer & "von " & Seitenzähler, Arial09, Brushes.Black, 660, Zeile)
            e.Graphics.DrawLine(SchwarzerStift, Spalte, Zeile + Zeilenhöhe + 2, 1000, Zeile + Zeilenhöhe + 2)
            Zeile += Zeilenhöhe * 3

            e.Graphics.DrawString("Projektkennung", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Projektkennung, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Bezeichnung", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Bezeichnung, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Beschreibung", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Beschreibung, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Author", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Author, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Copyright", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Copyright, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Anlagedatum", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Anlagedatum, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Änderungsdatum", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_Änderungsdatum, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Anzahl Seiten", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_AnzahlSeiten, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            e.Graphics.DrawString("Anzahl Objekte", Arial10, Brushes.Gray, Spalte, Zeile)
            e.Graphics.DrawString(Kopf_AnzahlObjekte, Arial10, Brushes.Black, 300, Zeile)
            Zeile += Zeilenhöhe
            ' ---> Vergleichsgröße ---> Bisher gedruckte Anzahl der Seiten um 1 erhöhen
            Lfd_Seitennr += 1
            '
            '
            If Gesamtzahl_der_Seiten > Lfd_Seitennr Then e.HasMorePages = True
            '
            '------------------------------------------------------------
            'Die nächste (logische) Seite aus der Datenbank einlesen 
            '------------------------------------------------------------
            For I = 1 To Kopf_AnzahlSeiten

                Seite_Seitenkennung = Kopf_Projektkennung & Format(I, " 000#")
                SeitenRow = SeitenTabelle.FindBySeitenkennung(Seite_Seitenkennung)
                If SeitenRow IsNot Nothing Then
                    Aktuelle_Seitennummer = I
                    Seite_AnzahlObjekte = SeitenRow.AnzahlObjekte
                    'Die Kopfzeile der Seite drucken
                    e.Graphics.DrawString("Seite " & Aktuelle_Seitennummer & "von " & Kopf_AnzahlSeiten, Arial09, Brushes.Gray, 400, 20)
                    e.Graphics.DrawLine(SchwarzerStift, Spalte, Zeile + Zeilenhöhe + 2, 1000, Zeile + Zeilenhöhe + 2)
                    'Die Anzahl der zu druckenden Ojekte -> für die aktuelle Seite <- einlesen
                    For J = 1 To Seite_AnzahlObjekte
                        Aktuelle_Objektnummer += 1
                        Objekt_Objektkennung = Seite_Seitenkennung & Format(Aktuelle_Objektnummer, " 000#")
                        ObjektRow = ObjektTabelle.FindByObjektkennung(Objekt_Objektkennung)
                        If ObjektRow IsNot Nothing Then
                            'Die Objektdaten einlesen   
                            With ObjektRow
                                Objekt_Projektkennung = .Projektkennung
                                Objekt_Seitenkennung = .Seitenkennung
                                Objekt_Objektkennung = .Objektkennung
                                Objekt_Seitennummer = .Seitennummer
                                Objekt_Objektnummer = .Objektnummer
                                Dim Img = Objekt_Objekt
                                Dim GrafikKonverter As New ImageConverter
                                Dim Konvertiertes_Bild = CType(GrafikKonverter.ConvertTo(Img, GetType(Byte())), Byte())
                                Dim IC As New ImageConverter
                                Objekt_Objekt = CType(IC.ConvertFrom(.Objekt), Image)
                                Objekt_Text = .Text
                                Objekt_Breite = .Breite
                                Objekt_Höhe = .Höhe
                                Objekt_PositionLinks = .PositionLinks
                                Objekt_PositionOben = .PositionOben
                                Objekt_ObjektfeldfarbeA = .ObjektfeldfarbeA
                                Objekt_ObjektfeldfarbeR = .ObjektfeldfarbeR
                                Objekt_ObjektfeldfarbeG = .ObjektfeldfarbeG
                                Objekt_ObjektfeldfarbeB = .ObjektfeldfarbeB
                                Objekt_Textausrichtung = .Textausrichtung
                                Objekt_TextfeldfarbeA = .TextfeldfarbeA
                                Objekt_TextfeldfarbeR = .TextfeldfarbeR
                                Objekt_TextfeldfarbeG = .TextfeldfarbeG
                                Objekt_TextfeldfarbeB = .TextfeldfarbeB
                                Objekt_TextfarbeA = .TextfarbeA
                                Objekt_TextfarbeR = .TextfarbeR
                                Objekt_TextfarbeG = .TextfarbeG
                                Objekt_TextfarbeB = .TextfarbeB
                                Objekt_TextfeldPositionLinks = .TextfeldPositionLinks
                                Objekt_TextfeldPositionOben = .TextfeldPositionOben
                                Objekt_TextfeldBreite = .TextfeldBreite
                                Objekt_TextfeldHöhe = .TextfeldHöhe
                                Objekt_TextfeldMaxZeichenzahl = .TextfeldMaxZeichenzahl
                                Objekt_TextfeldSchriftname = .TextfeldSchriftname
                                Objekt_TextfeldSchriftgröße = .TextfeldSchriftgröße
                                Objekt_TextfeldFett = .TextfeldFett
                                Objekt_TextfeldKursiv = .TextfeldKursiv
                                Objekt_TetfeldUnterstrichen = .TextfeldUnterstrichen
                                Objekt_TextfeldDurchgestrichen = .TextfeldDurchgestrichen
                                Objekt_Anlagedatum = .Anlagedatum
                                Objekt_Änderungsdatum = .Änderungsdatum
                            End With
                        End If
                        Lfd_Seitennr += 1
                        'Prüfen, ob noch weitere zu druckende Seiten vorhanden sind
                        'Wenn ja, eine weitere -> Druckseite <- initiieren
                        'e.HasMorePages = Gesamtzahl_der_Seiten >= Lfd_Seitennr
                        If Gesamtzahl_der_Seiten > Lfd_Seitennr Then e.HasMorePages = True
                        'Das Objekt drucken
                        e.Graphics.DrawImage(Objekt_Objekt, Objekt_PositionLinks, Objekt_PositionOben)
                        e.Graphics.DrawString(Objekt_Text, Arial08, Brushes.Black, Objekt_TextfeldPositionLinks, Objekt_TextfeldPositionOben)
                        'Zurück zur Schleife - J - und den nächsten Datensatz -> ObjektTabelle <- einlesen
                    Next J

                End If

                'Zurück zur Schleife - I - und den nächsten Datensatz -> SeitenTabelle <- einlesen
            Next I
            e.HasMorePages = False
        End Sub
    End Module
    Mittwoch, 4. Januar 2017 20:35

Antworten

  • Hallo,

    Du musst erst alles Seiten übergeben und erst dann drucken. So sollte es gehen:

    void Druck()
            {
                using (var pd = new System.Drawing.Printing.PrintDocument())
                {
                    pd.PrinterSettings.PrinterName = "DruckerName";
                    
                    pd.PrintPage += (sender, args) => //Wird solange ausgelöst bis HasMorePage == false
                    {
                        printDoc_PrintPage(bilderZumDruck[0].filePath, model.duplex, args);
                        if (bilderZumDruck.Count > 1)
                        {
                            bilderZumDruck.Remove(bilderZumDruck[0]);
                            args.HasMorePages = true;
                        }
                    };
                    pd.Print();
    
                }
            }
    
            void printDoc_PrintPage(string path, bool duplex, System.Drawing.Printing.PrintPageEventArgs e)
            {
                //Seite zeichnen
                System.Drawing.Image bild = System.Drawing.Image.FromFile(path);
                System.Drawing.Point point = new System.Drawing.Point(0, 0);
                e.Graphics.DrawImage(bild, point);
            }


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Mittwoch, 4. Januar 2017 21:09

Alle Antworten

  • Hallo,

    Du musst erst alles Seiten übergeben und erst dann drucken. So sollte es gehen:

    void Druck()
            {
                using (var pd = new System.Drawing.Printing.PrintDocument())
                {
                    pd.PrinterSettings.PrinterName = "DruckerName";
                    
                    pd.PrintPage += (sender, args) => //Wird solange ausgelöst bis HasMorePage == false
                    {
                        printDoc_PrintPage(bilderZumDruck[0].filePath, model.duplex, args);
                        if (bilderZumDruck.Count > 1)
                        {
                            bilderZumDruck.Remove(bilderZumDruck[0]);
                            args.HasMorePages = true;
                        }
                    };
                    pd.Print();
    
                }
            }
    
            void printDoc_PrintPage(string path, bool duplex, System.Drawing.Printing.PrintPageEventArgs e)
            {
                //Seite zeichnen
                System.Drawing.Image bild = System.Drawing.Image.FromFile(path);
                System.Drawing.Point point = new System.Drawing.Point(0, 0);
                e.Graphics.DrawImage(bild, point);
            }


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Mittwoch, 4. Januar 2017 21:09
  • Hallo Thomas,

    besten Dank für die Antwort und schöne Grüße aus Schwetztingen

    Herbert Brenner

    Freitag, 6. Januar 2017 10:52