Hi Leute
bin seit Tagen dabei eine Lösung für mein Problem zu finden, leider ohne Erfolg.
Ich versuche eine Rechnung als PDF zu drucken. Die Rechnung ist in mehreren Seiten und aufgebaut, die Rechnungspositionen werden tabellarisch dargestellt.
Page 1 => Rechnungskopf, kurzer Text, und dann die Rechnungsaufstellung, ggf. Seitenende falls nichts mehr zu drucken da ist und genügend Platz vorhanden
Page 2 => fortlaufende Rechnungsaufstellung, ggf. Seitenende falls nichts mehr zu drucken da ist und genügend Platz vorhanden
Die Daten für die Rechnung habe ich in einem typisierten Dataset.
Beim drucken der entsprechenden Datarow kann es vorkommen, das eine DataColumn sehr langen text hat, der nicht mehr auf die Seite passt und daher einen Seitenwechsel erfolgt. Das klappt auch alles wunderbar.
Leider wird der text nicht an der Stelle fortgeführt, an der aufgehört wurde. Der Druck läuft dann mit der nächsten zu druckenden DataRow weiter. Hab mir auch noch mal das Tutorial von @RodFromGermany vorgenommen.
Leider weiß ich nicht, wie ich die For-Schleife unterbrechen und dann auf nächster Seite an der korrekten Stelle weiterdrucken soll. Ich bekomme es hin, das die zunächst zu drukende DataRow kompett auf einer zusammenhängend gedruckt wird. Das bedeutet aber auch, das die jeweilige Seite zur hälfte leer sein kann, wenn der text zu lang wird. Ist vermutlich nicht der eleganteste Code, aber bis auf dieses Prob funktionierts.
Hier mal mein Code:
Spoiler anzeigen
aufgrund des Codeumfangs Spoiler hinzugefügt ~VaporiZed
bin seit Tagen dabei eine Lösung für mein Problem zu finden, leider ohne Erfolg.
Ich versuche eine Rechnung als PDF zu drucken. Die Rechnung ist in mehreren Seiten und aufgebaut, die Rechnungspositionen werden tabellarisch dargestellt.
Page 1 => Rechnungskopf, kurzer Text, und dann die Rechnungsaufstellung, ggf. Seitenende falls nichts mehr zu drucken da ist und genügend Platz vorhanden
Page 2 => fortlaufende Rechnungsaufstellung, ggf. Seitenende falls nichts mehr zu drucken da ist und genügend Platz vorhanden
Die Daten für die Rechnung habe ich in einem typisierten Dataset.
Beim drucken der entsprechenden Datarow kann es vorkommen, das eine DataColumn sehr langen text hat, der nicht mehr auf die Seite passt und daher einen Seitenwechsel erfolgt. Das klappt auch alles wunderbar.
Leider wird der text nicht an der Stelle fortgeführt, an der aufgehört wurde. Der Druck läuft dann mit der nächsten zu druckenden DataRow weiter. Hab mir auch noch mal das Tutorial von @RodFromGermany vorgenommen.
Leider weiß ich nicht, wie ich die For-Schleife unterbrechen und dann auf nächster Seite an der korrekten Stelle weiterdrucken soll. Ich bekomme es hin, das die zunächst zu drukende DataRow kompett auf einer zusammenhängend gedruckt wird. Das bedeutet aber auch, das die jeweilige Seite zur hälfte leer sein kann, wenn der text zu lang wird. Ist vermutlich nicht der eleganteste Code, aber bis auf dieses Prob funktionierts.
Hier mal mein Code:
VB.NET-Quellcode
- Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
- Dim margin = PrintDocument1.DefaultPageSettings.Margins
- Dim g = e.Graphics
- Dim brush As New SolidBrush(Color.LightGray)
- Dim brush1 As New SolidBrush(Color.Black)
- Dim pen1 As New Pen(Brushes.LightGray, 0.5)
- Dim pen2 As New Pen(Brushes.DarkGray, 0.5)
- Dim pen3 As New Pen(Brushes.White, 0.5)
- Dim LineHeight As Single = Me.myfont.GetHeight
- margin.Left = 30
- margin.Right = 30
- margin.Top = 30
- margin.Bottom = 30
- leftMargin = margin.Left
- rightMargin = margin.Right
- topMargin = margin.Top
- bottomMargin = margin.Bottom
- Dim rc = e.Graphics.VisibleClipBounds
- rc.Offset(margin.Left + 30, margin.Top + 30) ' obere linke Ecke
- rc.Width -= (margin.Left + 20 + margin.Right - 20) ' neue Breite
- rc.Height -= (margin.Top + margin.Bottom) ' neue Höhe
- Dim zeile = DirectCast(DirectCast(CompanyBindingSource.Current, DataRowView).Row, DtsFirma.CompanyRow)
- X = leftMargin
- Y = topMargin
- Dim strformat As New StringFormat(StringFormatFlags.LineLimit)
- Dim charactersfitted As Integer
- Dim linesfilled As Integer
- If pagenb = 0 Then
- Y += 240
- g.DrawString(KundeComboBox.Text, myfontbold, Brushes.Black, X + 10, Y + 10)
- Y += 30
- g.DrawString(StrasseTextBox.Text & vbCrLf & PLZTextBox.Text & " " & StadtTextBox.Text, myfont, Brushes.Black, X + 10, Y)
- Y += 50
- g.DrawString(Format(AuftragsdatumDateTimePicker.Value.ToShortDateString), myfontbold, Brushes.Black, X + 650, Y)
- Y += 50
- g.DrawString("Auftragsnummer" & vbTab & vbTab & ":", myfontbold, Brushes.Black, X + 10, Y)
- If DtsAufträge.Auftragsübersicht.Rows.Count > 0 Then
- g.DrawString(AuftragsnummerTextBox.Text, myfont, Brushes.Black, X + 200, Y)
- Else
- g.DrawString("", myfont, Brushes.Black, X + 200, Y)
- End If
- Y += 20
- g.DrawString("Bauvorhaben" & vbTab & vbTab & ":", myfontbold, Brushes.Black, X + 10, Y)
- g.DrawString(BauvorhabenTextBox.Text, myfont, Brushes.Black, X + 200, Y)
- Y += 20
- If ZahlungsbedingungenTextBox.Text <> "" Then
- g.DrawString("Zahlungsbedingungen" & vbTab & ":", myfontbold, Brushes.Black, X + 10, Y)
- g.DrawString(ZahlungsbedingungenTextBox.Text, myfont, Brushes.Black, X + 200, Y)
- End If
- Y += 50
- If AnredeTextBox.Text = "Herr" Then
- g.DrawString("Sehr geehrter Herr " & AnsprechpartnerTextBox.Text & "," & vbCrLf & "für Ihren Auftrag bedanken wir uns und berechnen für unsere Leistungen wie folgt:", myfont, Brushes.Black, X + 10, Y)
- ElseIf AnredeTextBox.Text = "Frau" Then
- g.DrawString("Sehr geehrte Frau " & AnsprechpartnerTextBox.Text & "," & vbCrLf & "für Ihren Auftrag bedanken wir uns und berechnen für unsere Leistungen wie folgt:", myfont, Brushes.Black, X + 10, Y)
- ElseIf AnredeTextBox.Text = "" Then
- g.DrawString("Sehr geehrte Damen und Herren," & vbCrLf & "für Ihren Auftrag bedanken wir uns und berechnen für unsere Leistungen wie folgt:", myfont, Brushes.Black, X + 10, Y)
- End If
- Y += 50
- g.FillRectangle(brush, X + 10, Y, 40, 30)
- g.DrawString("Pos.", myfontbold, Brushes.Black, X + 15, Y + 5)
- g.FillRectangle(brush, X + 52, Y, 400, 30)
- g.DrawString("Leistung", myfontbold, Brushes.Black, X + 240, Y + 5)
- g.FillRectangle(brush, X + 454, Y, 65, 30)
- g.DrawString("Menge", myfontbold, Brushes.Black, X + 462, Y + 5)
- g.FillRectangle(brush, X + 521, Y, 55, 30)
- g.DrawString("Einheit", myfontbold, Brushes.Black, X + 524, Y + 5)
- g.FillRectangle(brush, X + 578, Y, 80, 30)
- g.DrawString("EP [€]", myfontbold, Brushes.Black, X + 600, Y + 5)
- g.FillRectangle(brush, X + 660, Y, 80, 30)
- g.DrawString("GP [€]", myfontbold, Brushes.Black, X + 685, Y + 5)
- For i = index To FKAuftragsübersichtAuftragsdetailBindingSource.Count - 1
- Dim row1 = DirectCast(DirectCast(FKAuftragsübersichtAuftragsdetailBindingSource.Current, DataRowView).Row, DtsAufträge.AuftragsdetailRow)
- Dim an = g.VisibleClipBounds
- an.Offset(X + 60, Y + 35)
- an.Width = 380
- an.Height = Y + (charactersfitted * linesfilled)
- Dim S As SizeF
- Dim Hoch As Double
- Dim B = 380
- indextext = 0
- S = g.MeasureString(row1.Leistung.Substring(indextext), myfont, an.Size, strformat, charactersfitted, linesfilled)
- Hoch = Ausgabenhöhe(S, B)
- If Y + (linesfilled * myfont.GetHeight) > 850 Then
- g.DrawString(String.Format(" - Seite {0} -", pagenb + 1), myfont, brush, 380, 1130)
- e.HasMorePages = True
- pagenb += 1
- Exit Sub
- Else
- If Not row1.IsLeistungNull Then
- g.DrawString(row1.Leistung.Substring(indextext), myfont, Brushes.Black, an, strformat)
- End If
- End If
- If Not row1.IsPosNull Then
- g.DrawString(CStr(row1.Pos), myfontbold, Brushes.Black, X + 17, Y + 35)
- End If
- Dim drawrect As New RectangleF(X + 60, Y + 35, B, CInt(Hoch))
- g.DrawRectangle(pen3, X + 58, Y + 33, CInt(B + 4), CInt(Hoch + 2))
- If Not row1.IsMengeNull Then
- g.DrawString(Format(row1.Menge, "N2"), myfont, Brushes.Black, X + 460, Y + 35)
- End If
- If Not row1.IsEinheitNull Then
- g.DrawString(Format(row1.Einheit), myfont, Brushes.Black, X + 530, Y + 35)
- End If
- If Not row1.IsEinzelpreisNull Then
- g.DrawString(Format(row1.Einzelpreis, "C2"), myfont, Brushes.Black, X + 598, Y + 35)
- End If
- If Not row1.IsGesamtpreisNull Then
- g.DrawString(Format(row1.Gesamtpreis, "C2"), myfont, Brushes.Black, X + 663, Y + 35)
- End If
- If Hoch > 20 Then
- Y += 35
- g.DrawLine(pen1, X + 51, Y, X + 51, Y + CInt(Hoch + 7))
- g.DrawLine(pen1, X + 453, Y, X + 453, Y + CInt(Hoch + 7))
- g.DrawLine(pen1, X + 520, Y, X + 520, Y + CInt(Hoch + 7))
- g.DrawLine(pen1, X + 577, Y, X + 577, Y + CInt(Hoch + 7))
- g.DrawLine(pen1, X + 659, Y, X + 659, Y + CInt(Hoch + 7))
- g.DrawLine(pen1, X + 10, Y + CInt(Hoch + 7), X + 739, Y + CInt(Hoch + 7))
- Y += CInt(Hoch) - 20
- End If
- If Hoch < 20 Then
- Y += 35
- g.DrawLine(pen1, X + 51, Y, X + 51, Y + 25)
- g.DrawLine(pen1, X + 453, Y, X + 453, Y + 25)
- g.DrawLine(pen1, X + 520, Y, X + 520, Y + 25)
- g.DrawLine(pen1, X + 577, Y, X + 577, Y + 25)
- g.DrawLine(pen1, X + 659, Y, X + 659, Y + 25)
- g.DrawLine(pen1, X + 10, Y + 25, X + 739, Y + 25)
- End If
- index += 1
- indextext += charactersfitted
- FKAuftragsübersichtAuftragsdetailBindingSource.MoveNext()
- If Y >= 850 Then
- e.HasMorePages = True
- pagenb += 1
- Exit Sub
- End If
- Next
- If Y >= 850 Then
- g.DrawString(String.Format(" - Seite {0} -", pagenb + 1), myfont, brush, 380, 1130)
- e.HasMorePages = True
- pagenb += 1
- Exit Sub
- Else
- Dim rectnetto = New RectangleF(X + 655, Y + 50, 85, Height)
- Dim rectmwst = New RectangleF(X + 655, Y + 72, 85, Height)
- Dim rectskonto = New RectangleF(X + 655, Y + 92, 85, Height)
- Dim rectbrutto = New RectangleF(X + 655, Y + 112, 85, Height)
- g.DrawString("Netto" & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbNetto.Text, myfont, Brushes.Black, rectnetto, _sfright)
- g.DrawLine(pen2, X + 550, Y + 68, X + 740, Y + 68)
- Y += 20
- g.DrawString("MwSt." & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbMwst.Text, myfont, Brushes.Black, rectmwst, _sfright)
- g.DrawLine(pen2, X + 550, Y + 68, X + 740, Y + 68)
- Y += 20
- g.DrawString("Skonto" & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbSkontobetrag.Text, myfont, Brushes.Black, rectskonto, _sfright)
- Y += 20
- g.DrawString("Brutto" & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbBrutto.Text, myfont, Brushes.Black, rectbrutto, _sfright)
- g.DrawLine(pen2, X + 550, Y + 68, X + 740, Y + 68)
- g.DrawLine(pen2, X + 550, Y + 70, X + 740, Y + 70)
- e.HasMorePages = False
- End If
- End If
- Y += 80
- If pagenb >= 1 Then
- X = leftMargin
- Y = topMargin
- Y += 30
- indextext = charactersfitted
- If index = FKAuftragsübersichtAuftragsdetailBindingSource.Count Then
- Else
- g.FillRectangle(brush, X + 10, Y, 40, 30)
- g.DrawString("Pos.", myfontbold, Brushes.Black, X + 15, Y + 5)
- g.FillRectangle(brush, X + 51, Y, 400, 30)
- g.DrawString("Leistung", myfontbold, Brushes.Black, X + 240, Y + 5)
- g.FillRectangle(brush, X + 453, Y, 65, 30)
- g.DrawString("Menge", myfontbold, Brushes.Black, X + 462, Y + 5)
- g.FillRectangle(brush, X + 519, Y, 60, 30)
- g.DrawString("Einheit", myfontbold, Brushes.Black, X + 528, Y + 5)
- g.FillRectangle(brush, X + 580, Y, 80, 30)
- g.DrawString("EP [€]", myfontbold, Brushes.Black, X + 600, Y + 5)
- g.FillRectangle(brush, X + 661, Y, 80, 30)
- g.DrawString("GP [€]", myfontbold, Brushes.Black, X + 685, Y + 5)
- End If
- For i = index To FKAuftragsübersichtAuftragsdetailBindingSource.Count - 1
- Dim row1 = DirectCast(DirectCast(FKAuftragsübersichtAuftragsdetailBindingSource.Current, DataRowView).Row, DtsAufträge.AuftragsdetailRow)
- Dim S As SizeF
- Dim Hoch As Double
- Dim B = 380
- Dim drawrect As New RectangleF(X + 60, Y + 35, B, CSng(Hoch))
- Dim an = g.VisibleClipBounds
- an.Offset(X + 60, Y + 35)
- S = g.MeasureString(row1.Leistung, myfont, B)
- Hoch = Ausgabenhöhe(S, B)
- an.Width = 380
- an.Height = CInt(Hoch)
- If Y >= 850 Then
- g.DrawString(String.Format(" - Seite {0} -", pagenb + 1), myfont, brush, 380, 1130)
- e.HasMorePages = True
- pagenb += 1
- Exit Sub
- Else
- If Not row1.IsLeistungNull Then
- g.DrawString(row1.Leistung.Substring(indextext), myfont, Brushes.Black, an, strformat)
- End If
- End If
- If Not row1.IsPosNull Then
- g.DrawString(CStr(row1.Pos), myfontbold, Brushes.Black, X + 17, Y + 35)
- End If
- g.DrawRectangle(pen3, X + 58, Y + 33, CInt(B + 4), CInt(Hoch + 2))
- If Not row1.IsMengeNull Then
- g.DrawString(Format(row1.Menge, "N2"), myfont, Brushes.Black, X + 465, Y + 35)
- End If
- If Not row1.IsEinheitNull Then
- g.DrawString(Format(row1.Einheit), myfont, Brushes.Black, X + 535, Y + 35)
- End If
- If Not row1.IsEinzelpreisNull Then
- g.DrawString(Format(row1.Einzelpreis, "C2"), myfont, Brushes.Black, X + 603, Y + 35)
- End If
- If Not row1.IsGesamtpreisNull Then
- g.DrawString(Format(row1.Gesamtpreis, "C2"), myfont, Brushes.Black, X + 668, Y + 35)
- End If
- index = i + 1
- FKAuftragsübersichtAuftragsdetailBindingSource.MoveNext()
- If Y >= 850 Or indextext < charactersfitted Then
- g.DrawString(String.Format(" - Seite {0} -", pagenb + 1), myfont, brush, 380, 1130)
- e.HasMorePages = True
- pagenb += 1
- Exit Sub
- End If
- Next
- Y += 30
- If Y >= 850 Then
- g.DrawString(String.Format(" - Seite {0} -", pagenb + 1), myfont, brush, 380, 1130)
- e.HasMorePages = True
- pagenb += 1
- Exit Sub
- Else
- Dim rectnetto = New RectangleF(X + 655, Y + 50, 85, Height)
- Dim rectmwst = New RectangleF(X + 655, Y + 72, 85, Height)
- Dim rectskonto = New RectangleF(X + 655, Y + 92, 85, Height)
- Dim rectbrutto = New RectangleF(X + 655, Y + 112, 85, Height)
- g.DrawString("Netto" & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbNetto.Text, myfont, Brushes.Black, rectnetto, _sfright)
- g.DrawLine(pen2, X + 550, Y + 68, X + 740, Y + 68)
- Y += 20
- g.DrawString("MwSt." & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbMwst.Text, myfont, Brushes.Black, rectmwst, _sfright)
- g.DrawLine(pen2, X + 550, Y + 68, X + 740, Y + 68)
- Y += 20
- g.DrawString("Skonto" & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbSkontobetrag.Text, myfont, Brushes.Black, rectskonto, _sfright)
- Y += 20
- g.DrawString("Brutto" & vbTab & "[€]", myfontbold, Brushes.Black, X + 550, Y + 50)
- g.DrawString(tbBrutto.Text, myfont, Brushes.Black, rectbrutto, _sfright)
- g.DrawLine(pen2, X + 550, Y + 68, X + 740, Y + 68)
- g.DrawLine(pen2, X + 550, Y + 70, X + 740, Y + 70)
- g.DrawString(String.Format(" - Seite {0} -", pagenb + 1), myfont, brush, 380, 1130)
- e.HasMorePages = False
- End If
- End If
- End Sub
aufgrund des Codeumfangs Spoiler hinzugefügt ~VaporiZed
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()