2013-01-05 219 views
0

我正在开发一个应用程序,使用itextsharp将pdf文档合并到一个文档中。我已经得到了创建的单个PDF。如何使用iTextSharp将表格添加到现有的pdf

现在我必须创建一个表并将其添加到第一页。

不幸的是,这比接缝变得更加复杂。经过数小时的努力,我能够将表格添加到第二页。

如何将表格添加到第一页?

我正在使用此示例项目进行测试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 

回答

0

我不知道你在哪里找到编写代码的灵感,但是我很抱歉地说你读过错误的文档。当您使用PdfWriter/PdfImportedPage复制文档时,您将丢弃原始文档中存在的所有交互性。如我的书第6章所述,使用PdfStamper完成现有页面的操作。见表6.1:http://www.manning.com/lowagie2/samplechapter6.pdf

如果要在第一页上标记内容,则需要使用stamper.GetOverContent(1)。例如参见StampText示例。应该使用WriteSelectedRows方法来添加表格,例如参见PdfCalendar示例。

请注意,您需要定义表格的坐标。也明白,PDF不是一种文字处理格式。该表格将与您指定的坐标中已存在的任何内容重叠(因为这是PDF工作的方式:所有内容均在绝对位置定义)。

+0

非常感谢你的指导。你给我的是我需要的。 – SGBoise

相关问题