0

itextsharpを使用してPDFドキュメントを1つのドキュメントにマージするアプリを開発しています。単一のPDFを作成しました。

次に、テーブルを作成して最初のページに追加する必要があります。

残念ながら、これは継ぎ目よりも複雑になっています。何時間も試した後、2ページ目にテーブルを追加することができました。

テーブルを最初のページに追加するにはどうすればよいですか?

このサンプルプロジェクトを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
4

1 に答える 1

0

コードを書くためのインスピレーションをどこで見つけたかはわかりませんが、間違ったドキュメントを読んだと言って申し訳ありません。を使用してドキュメントをコピーPdfWriter/PdfImportedPageすると、元のドキュメントに存在するすべての対話機能が破棄されます。既存のページの操作はPdfStamper、私の本の第6章で説明されているように行われます。表6.1を参照してください:http://www.manning.com/lowagie2/samplechapter6.pdf

最初のページにコンテンツをスタンプする場合は、を使用する必要がありますstamper.GetOverContent(1)。たとえば、このStampTextの例を参照してください。テーブルの追加は、WriteSelectedRowsメソッドを使用して実行する必要があります。たとえば、PdfCalendarの例を参照してください。

テーブルの座標を定義する必要があることに注意してください。また、PDFはワードプロセッシングフォーマットではないことも理解してください。テーブルは、指定した座標にすでに存在するすべてのコンテンツとオーバーラップします(PDFの動作方法であるため、すべてのコンテンツは絶対位置で定義されます)。

于 2013-01-05T10:25:02.593 に答える