问题
I'm developing an app to merging pdf documents into one document using itextsharp. I've gotten the single pdf created.
Now I have to create a table and add it to the first page.
Unfortunately this is becoming more complicated than it seams. After hours of trying I was able to add the table into the second page.
How can I add the table to the first page?
I'm using this sample project for testing http://gamepacks.org/Sample.zip.
Public Sub MergePdfFiles(ByVal docList As List(Of String), ByVal outputPath As String)
Try
'
' http://www.vbforums.com/showthread.php?475920-Merge-Pdf-Files-and-Add-Bookmarks-to-It-(Using-iTextSharp)
'
If docList.Count = 0 Then Exit Sub
Dim OutlineList As List(Of PdfOutline) = New List(Of PdfOutline)
Dim FirstPageIndex As Integer = 1 ' Tracks which page to link the bookmark
Dim result As Boolean = False
Dim pdfCount As Integer = 0 'total input pdf file count
Dim fileName As String = String.Empty 'current input pdf filename
Dim reader As iTextSharp.text.pdf.PdfReader = Nothing
Dim pageCount As Integer = 0 'current input pdf page count
Dim doc As iTextSharp.text.Document = Nothing 'the output pdf document
Dim writer As PdfWriter = Nothing
Dim cb As PdfContentByte = Nothing
'Declare a variable to hold the imported pages
Dim page As PdfImportedPage = Nothing
Dim rotation As Integer = 0
'Now loop thru the input pdfs
For Each row As String In docList
reader = New iTextSharp.text.pdf.PdfReader(row)
' Is this the first pdf file
If (row = docList(0)) Then
doc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1), 18, 18, 18, 18)
writer = PdfWriter.GetInstance(doc, New IO.FileStream(outputPath, IO.FileMode.Create))
doc.Open()
' Always show the bookmarks
writer.ViewerPreferences = PdfWriter.PageModeUseOutlines
'Instantiate a PdfContentByte object
cb = writer.DirectContentUnder
End If
For i As Integer = 1 To reader.NumberOfPages
'Get the input page size
doc.SetPageSize(reader.GetPageSizeWithRotation(i))
'Create a new page on the output document
doc.NewPage()
'Now we get the imported page
page = writer.GetImportedPage(reader, i)
'Read the imported page's rotation
rotation = reader.GetPageRotation(i)
'Then add the imported page to the PdfContentByte object as a template based on the page's rotation
If rotation = 90 Then
cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height)
ElseIf rotation = 270 Then
cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(i).Width + 60, -30)
Else
cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0)
End If
Next
Next
' NEED TO ADD THIS TO THE FIRST PAGE
doc.Add(_stateTable)
doc.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Function _stateTable() As PdfPTable
Dim col As String() = {"No.", "Name", "City"}
Dim table As New PdfPTable(3)
table.WidthPercentage = 75
table.SetWidths(New [Single]() {1, 5, 4})
table.SpacingBefore = 10
For i As Integer = 0 To col.Length - 1
Dim cell As New PdfPCell(New Phrase(col(i)))
cell.BackgroundColor = New BaseColor(204, 204, 204)
table.AddCell(cell)
Next
table.AddCell("32")
table.AddCell("Jack")
table.AddCell("Sgeg")
table.AddCell("33")
table.AddCell("Mike")
table.AddCell("Twin")
Return table
End Function
回答1:
I don't know where you found the inspiration for writing your code, but I'm sorry to say that you've read the wrong documentation. When you copy a document using PdfWriter/PdfImportedPage
, you're throwing away all interactivity that exists in the original document. Manipulating an existing page is done with PdfStamper
as described in chapter 6 of my book. See table 6.1: http://www.manning.com/lowagie2/samplechapter6.pdf
If you want to stamp content on the first page, you need to use stamper.GetOverContent(1)
. See for instance this StampText example. Adding a table should be done with the WriteSelectedRows method, see for instance the PdfCalendar example.
Note that you need to define the coordinates of the table. Also understand that PDF is NOT a Word processing format. The table will overlap with any content that already exists at the coordinates you specified (because that's the way PDF works: all content is defined at absolute positions).
来源:https://stackoverflow.com/questions/14168110/how-do-i-add-table-to-existing-pdf-using-itextsharp