1

私はそれを機能させることができないいくつかのコードに取り組んでいます。

複数のPDFを取得して1つのファイルにマージするプログラムがあります。ここで、最初のページに目次を作成する必要があります。以下にドキュメントの例を示します。

の専門家に委託したいiTextSharp。これには、最長で 1 時間か 2 時間以上かかるとは思いません。

要件は次のとおりです。

  • 目次はブックマークに基づいています。
  • toc テキストは適切なページにリンクされるため、ユーザーはテキストをクリックしてそのページに移動できます。
  • sample1.pdf の既存のブックマークはそのままにしておく必要があります。
  • ページ番号はすでに計算されているので、心配する必要はありません。
  • 作業コードは、私が提供する VB.Net プロジェクト ファイルの一部である必要があります。いくつかのスニペットを試してみましたが、うまくいきませんでした。コードを変更しなくても機能するようにしたいと思います。
  • 私が生成するファイルは次のようになります: http://gamepacks.org/sample1.pdf
  • toc を含むファイルは次のようになります (フォント スタイルではなくレイアウト): http://gamepacks.org/sample2.pdf

私を助けてくれる人に感謝します。

sample1.pdf を生成するために使用したコードは次のようになります。

Public Sub MergePdfFiles(ByVal docList As List(Of Portal.DocumentRow), ByVal outputPath As String)
    '
    ' 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 tmpFile As String = "c:\STEP_1_Working.pdf"

    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 Portal.DocumentRow In docList
        reader = New iTextSharp.text.pdf.PdfReader(row.FilePath)

        ' Is this the first pdf file
        If (row.Name = docList(0).Name) Then
            doc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1), 18, 18, 18, 18)
            writer = PdfWriter.GetInstance(doc, New IO.FileStream(tmpFile, IO.FileMode.Create))

            ' Always show the bookmarks
            writer.ViewerPreferences = PdfWriter.PageModeUseOutlines

            'Set metadata and open the document
            With doc
                .AddAuthor("Sample Title")
                .AddCreationDate()
                .Open()
            End With

            '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()

            'If it is the 1st page, we add bookmarks to the page
            If i = 1 Then
                If row.Parent = "" Then
                    Dim oline As PdfOutline = New PdfOutline(cb.RootOutline, PdfAction.GotoLocalPage(FirstPageIndex, New PdfDestination(FirstPageIndex), writer), row.Name)
                Else
                    Dim parent As PdfOutline = Nothing
                    For Each tmp As PdfOutline In cb.RootOutline.Kids
                        If tmp.Title = row.Parent Then
                            parent = tmp
                        End If
                    Next

                    ' Create new group outline
                    If parent Is Nothing Then
                        parent = New PdfOutline(cb.RootOutline, PdfAction.GotoLocalPage(FirstPageIndex, New PdfDestination(FirstPageIndex), writer), row.Parent)
                    End If

                    ' Add to new parent
                    Dim oline As PdfOutline = New PdfOutline(parent, PdfAction.GotoLocalPage(FirstPageIndex, New PdfDestination(FirstPageIndex), writer), row.Name)

                    OutlineList.Add(oline)
                End If

                FirstPageIndex += reader.NumberOfPages
            End If

            '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

    doc.Close()

End Sub
4

0 に答える 0