Holladiho
Ich quäle mich nun seid einiger Zeit mit dem Thema pdf Erstellung herum, und habe verschiedene dlls ausprobiert - und das Thema dann erstmal beiseite geschobben.
Nun ist die Erstellung der pdf das Einzige, was an meinem Programm zur Fertigstellung fehlt. Also komme ich nicht mehr drumherum.
Durch Zufall bin ich auf folgenden Blog gestoßen: emoreau.com/Entries/Articles/2…-PDF-from-Net-easily.aspx
Diese library, bzw. das Demoprojekt dazu habe ich zumindest Ansatzweise (echt nur im Ansatz) verstanden. Jedoch verstehe ich die Positionierung des Headers und des Footers nicht.
Auch die Erstellung des Headers und Footers ist mir nicht ganz begreiflich.
Hier erstmal der Code des Demoprojektes:
Spoiler anzeigen
Meine Versuche der Headerausrichtung, findet ihr in der vorletzen Sub - CreateTableStart - hier verstehe ich nicht, wie die PosY auf dem Blatt dargestellt wird.
1. Frage Wenn ich z.B. reinschreibe, bedeutet das doch 2,5cm, müsste also mit cm Abstand vom oberen Rand dargestellt werden. WIrds aber nicht - ist unten. Warum?
Auf der Codesource Seite des Projektes heißt es:
Der Punkt 0,0 müsste doch demnach die obere linke ecke sein. PosY = 1 sind dann also 2,54cm vom linken Rand. Stimmt aber nich.
2. Frage, Wie stelle ich es an eine zweite Headerzeile direkt unter der ersten darzustellen? Muss ich hier die Position angeben, oder gibt es auch etwas wie einen Zeilenumbruch?
3.Frage: Wie funktioniert die Headererstellung an sich? Mir ist die Sache mit dem Event nicht ganz begreiflich.
Ich quäle mich nun seid einiger Zeit mit dem Thema pdf Erstellung herum, und habe verschiedene dlls ausprobiert - und das Thema dann erstmal beiseite geschobben.
Nun ist die Erstellung der pdf das Einzige, was an meinem Programm zur Fertigstellung fehlt. Also komme ich nicht mehr drumherum.
Durch Zufall bin ich auf folgenden Blog gestoßen: emoreau.com/Entries/Articles/2…-PDF-from-Net-easily.aspx
Diese library, bzw. das Demoprojekt dazu habe ich zumindest Ansatzweise (echt nur im Ansatz) verstanden. Jedoch verstehe ich die Positionierung des Headers und des Footers nicht.
Auch die Erstellung des Headers und Footers ist mir nicht ganz begreiflich.
Hier erstmal der Code des Demoprojektes:
VB.NET-Quellcode
- Option Strict On
- Imports PdfFileWriter
- Public Class Form1
- Inherits Form
- Private _document As PdfDocument
- Private _page As PdfPage
- Private _contents As PdfContents
- Private _normalFont As PdfFont
- Private _tableTitleFont As PdfFont
- Private _pageNumber As Integer
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
- listBox1.Items.Add("Starting the process")
- 'create a source of test data
- listBox1.Items.Add("Creating the data source...")
- Dim dt As DataTable = CreateDataTable()
- dataGridView1.DataSource = dt
- 'Create empty document and some fonts
- listBox1.Items.Add("Creating the document and some properties...")
- _document = New PdfDocument(PaperType.Letter, False, UnitOfMeasure.Inch, "Test.pdf")
- _normalFont = PdfFont.CreatePdfFont(_document, "Arial", FontStyle.Regular, True)
- _tableTitleFont = PdfFont.CreatePdfFont(_document, "Times New Roman", FontStyle.Bold, True)
- 'Generate the PDF file
- listBox1.Items.Add("Generate the PDF file...")
- GeneratePDF(dt)
- 'Complete the process
- listBox1.Items.Add("Closing the file...")
- _document.CreateFile()
- 'start default PDF reader and display the file
- listBox1.Items.Add("Opening the newly generated file...")
- Process.Start("Test.pdf")
- listBox1.Items.Add("Process is completed")
- End Sub
- Private Function CreateDataTable() As DataTable
- Using dt As DataTable = New DataTable("Products")
- dt.Columns.Add("ID", GetType(Integer))
- dt.Columns.Add("Code", GetType(String))
- dt.Columns.Add("Description", GetType(String))
- dt.Columns.Add("Price", GetType(Decimal))
- Dim rand As Random = New Random()
- For i As Integer = 1 To 222
- dt.LoadDataRow(New Object() {i, "Item" & i.ToString("0000"), $"Description of item {i}", Math.Round(100 * rand.NextDouble(), 2)}, True)
- Next
- Return dt
- End Using
- End Function
- Public Sub GeneratePDF(ByVal pDataTable As DataTable)
- Const columnID As Integer = 0
- Const columnCode As Integer = 1
- Const columnDesc As Integer = 2
- Const columnPrice As Integer = 3
- ' Add new page
- _page = New PdfPage(_document)
- ' Add contents to page
- _contents = New PdfContents(_page)
- ' create table
- Dim table As PdfTable = New PdfTable(_page, _contents, _normalFont, 9.0)
- table.SetColumnWidth(1.0, 1.0, 2.0, 1.0)
- ' event handlers for headers and footers
- AddHandler table.TableStartEvent, AddressOf CreateTableStart
- AddHandler table.TableEndEvent, AddressOf CreateTableEnd
- table.HeaderOnEachPage = True
- ' set all borders
- table.Borders.SetAllBorders(0.012, Color.DarkGray, 0.0025, Color.DarkGray)
- ' define the header
- table.DefaultHeaderStyle.Alignment = ContentAlignment.MiddleCenter
- table.Header(columnID).Value = "ID"
- table.Header(columnCode).Value = "Code"
- table.Header(columnDesc).Value = "Description"
- table.Header(columnPrice).Value = "Price"
- ' make some changes to default cell style
- table.DefaultCellStyle.Alignment = ContentAlignment.MiddleLeft
- ' create private styles for price column
- Dim normalPriceStyle As PdfTableStyle = table.CellStyle
- normalPriceStyle.Alignment = ContentAlignment.MiddleRight
- normalPriceStyle.Format = "#,##0.00"
- Dim highPriceStyle As PdfTableStyle = table.CellStyle
- highPriceStyle.BackgroundColor = Color.Red
- highPriceStyle.ForegroundColor = Color.White
- highPriceStyle.Alignment = ContentAlignment.MiddleRight
- highPriceStyle.Format = "#,##0.00"
- 'loop through each rows
- For Each row As DataRow In pDataTable.Rows
- table.Cell(columnID).Value = row("ID")
- table.Cell(columnCode).Value = row("Code")
- table.Cell(columnDesc).Value = row("Description")
- Dim decPrice As Decimal
- Decimal.TryParse(row("Price").ToString(), decPrice)
- table.Cell(columnPrice).Value = decPrice
- table.Cell(columnPrice).Style = If(decPrice > 80, highPriceStyle, normalPriceStyle)
- table.DrawRow()
- Next
- table.Close()
- End Sub
- Private Sub CreateTableStart(ByVal pPdfTable As PdfTable, ByVal pTableStartPos As Double)
- 'Header mitte
- Dim posX As Double = 0.5 * (pPdfTable.TableArea.Left + pPdfTable.TableArea.Right)
- Dim posY As Double = pTableStartPos + _tableTitleFont.Descent(16.0) + 0.05
- pPdfTable.Contents.DrawText(_tableTitleFont, 16.0, posX, posY, TextJustify.Center, DrawStyle.Normal, Color.Blue, "Header Mitte")
- 'Header links
- posX = pPdfTable.TableArea.Left
- posY = pTableStartPos + _tableTitleFont.Descent(16.0) + 0.05
- pPdfTable.Contents.DrawText(_tableTitleFont, 16.0, posX, posY, TextJustify.Center, DrawStyle.Normal, Color.Blue, "Header Links")
- 'Header rechts
- posX = pPdfTable.TableArea.Right
- posY = pTableStartPos + _tableTitleFont.Descent(16.0) + 0.7
- pPdfTable.Contents.DrawText(_tableTitleFont, 16.0, posX, posY, TextJustify.Center, DrawStyle.Normal, Color.Blue, "Header rechts")
- End Sub
- Private Sub CreateTableEnd(ByVal pPdfTable As PdfTable, ByVal pTableEndPos As Double)
- Dim posX As Double = pPdfTable.TableArea.Left
- Dim posY As Double = pTableEndPos - _tableTitleFont.Ascent(12.0) + 0.5
- _pageNumber += 1
- pPdfTable.Contents.DrawText(_tableTitleFont, 12.0, posX, posY, TextJustify.Left, DrawStyle.Normal, Color.Black, "page " & _pageNumber)
- End Sub
- End Class
Meine Versuche der Headerausrichtung, findet ihr in der vorletzen Sub - CreateTableStart - hier verstehe ich nicht, wie die PosY auf dem Blatt dargestellt wird.
1. Frage Wenn ich z.B. reinschreibe, bedeutet das doch 2,5cm, müsste also mit cm Abstand vom oberen Rand dargestellt werden. WIrds aber nicht - ist unten. Warum?
Auf der Codesource Seite des Projektes heißt es:
2.1. Coordinate system and Unit of Measure
The PDF coordinate system origin is at the bottom left corner of the page. The X-axis is pointing to the right. The Y-axis is pointing in upward direction.
Der Punkt 0,0 müsste doch demnach die obere linke ecke sein. PosY = 1 sind dann also 2,54cm vom linken Rand. Stimmt aber nich.
2. Frage, Wie stelle ich es an eine zweite Headerzeile direkt unter der ersten darzustellen? Muss ich hier die Position angeben, oder gibt es auch etwas wie einen Zeilenumbruch?
3.Frage: Wie funktioniert die Headererstellung an sich? Mir ist die Sache mit dem Event nicht ganz begreiflich.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()