如何使用iTextSharp将表添加到现有pdf [英] How do I add table to existing pdf using iTextSharp
问题描述
我正在开发一个应用程序,使用itextsharp将pdf文档合并到一个文档中。我已经创建了单个pdf。
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?
我正在使用此示例项目进行测试 http://gamepacks.org/Sample.zip 。
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
推荐答案
我不知道你在哪里找到了编写代码的灵感,但我很遗憾地说你读错了文件。使用 PdfWriter / PdfImportedPage
复制文档时,您将丢弃原始文档中存在的所有交互性。使用 PdfStamper
操作现有页面,如本书第6章所述。见表6.1: http://www.manning.com/lowagie2/samplechapter6.pdf
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
如果要在第一页上标记内容,则需要使用 stamper.GetOverContent(1)
。例如,请参阅此 StampText 示例。使用WriteSelectedRows方法添加表格,例如参见 PdfCalendar 示例。
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.
请注意,您需要定义表格的坐标。还要了解PDF不是Word处理格式。该表将与您指定的坐标处已存在的任何内容重叠(因为这是PDF的工作方式:所有内容都在绝对位置定义)。
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).
这篇关于如何使用iTextSharp将表添加到现有pdf的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!