2

1 週間前に iTextSharp を使い始めたばかりです。

PDFWriter を使用して動的コンテンツを追加する前に、PDF レポート構造 (行、画像、静的テキスト) を作成したいと考えています。このレポート テンプレートは、3 種類のレポートに使用されます。

つまり、ページを作成したら、1 ページに戻って新しいコンテンツを追加し、2 ページに移動してさらにコンテンツを追加し、3 ページに移動します。事前に必要なページ数を決定してテンプレートを作成し、コンテンツを追加します。

ページの作成に問題はありません。GotoLocalPage を使用してページ 1 (または呼び出したいページ) に戻るのに問題はありません。しかし、追加したい新しい直接コンテンツはすべて最終ページに表示されます。

カーソルまたは挿入ポイント (知識不足のため) を前のページに移動し、新しいコンテンツの追加を開始するにはどうすればよいですか?

アウトライン、ブックマーク、アンカーを試しましたが、それらはすべてページにテキストを追加しているように見えます - 目に見えないアンカーのようなものですか (つまり、空の文字列を使用していますか?)

ドキュメントを閉じて再度開いてコンテンツを追加したくありません。ドキュメントの特定の部分に移動してコンテンツを追加する方法が必要です。

参照としていくつかのコードを追加しました - コードは VB.net ですが、Java または C# の解釈に問題はありません - 申し訳ありませんが、画像を追加できませんでした。

Private Sub BuildPDFDocument(ByVal DocType As String, ByVal OutFileName As String, ByVal Pages As Integer)

    OutFile = New Document(PageSize.LETTER, 0, 0, 0, 0)

    OutFile.SetPageSize(PageSize.LETTER.Rotate())

    Try

        Using Writer = PdfWriter.GetInstance(OutFile, New FileStream(WorkingOutputFolder & OutFileName, FileMode.Create))

            OutFile.Open()

            '-------------------------------------------------------------------------------------------------------------------

            ContentByte = Writer.DirectContent

            For i = 1 To Pages

                If i > 1 Then OutFile.NewPage()

                AddTemplateImages()

                AddTemplateLines()

                AddTemplateText(DocType, i, Pages)

                AddColumnText()

                AddBarcodeEAN()

                AddBarcode39()

                AddBarcodeQR()


                'THIS WORKS BUT I DO NOT WANT TO ADD DYNAMIC CONTENT HERE 
                'I WANT TO BUILD TEMPLATE FIRST AND THEN GO BACK TO PAGE ONE AND ADD MORE CONTENT

                'AddDynamicContent(i)

            Next

            '-------------------------------------------------------------------------------------------------------------------

            Dim Action As PdfAction

            For i = 1 To Pages

                'Action = PdfAction.GotoLocalPage(i, New PdfDestination(PdfDestination.FIT), Writer)

                Action = PdfAction.GotoLocalPage(i, New PdfDestination(PdfDestination.XYZ, -1, 10000, 0), Writer)

                Writer.SetOpenAction(Action)

                'HERE IS THE PROBLEM - I WANT TO GO TO A SPECIFIC PAGE THEN ADD SOME CONTENT
                'WHEN DONE MOVE TO THE NEXT PAGE ADD SOME MORE CONTENT AND SO AND SO FORTH

                'BUT ALL THE CONTENT ENDS UP ON THE LAST PAGE REGARDLESS OF ME MOVING FROM PAGE TO PAGE

                'HOW DO I MOVE THE CURSOR or INSERTION POINT TO A LOCAL PAGE I HAVE CALLED
                'AND ADD NEW Chunks/Phrases/Paragraphs TO THAT PAGE

                AddDynamicContent(i)

            Next

            'GO BACK TO PAGE 1

            Action = PdfAction.GotoLocalPage(1, New PdfDestination(PdfDestination.FIT), Writer)

            Writer.SetOpenAction(Action)

            '-------------------------------------------------------------------------------------------------------------------

            OutFile.Close()

        End Using

    Catch ex As Exception

        MsgBox(ex.Message)

    End Try

End Sub

Private Sub AddDynamicContent(ByVal PageNumber As Integer)

    'JUST TESTING RIGHT NOW

    ContentByte.BeginText()

    '------------------------------------------------------------------------------

    ContentByte.SetFontAndSize(FontByName("TimesNewRoman"), 8)
    ContentByte.SetTextMatrix(58.0F, 333.0F)
    ContentByte.ShowText("DYNAMIC CONTENT ON PAGE " & PageNumber.ToString)

    '------------------------------------------------------------------------------

    ContentByte.EndText()

End Sub
4

1 に答える 1

0

iText(Sharp) は、ページのすべてのコンテンツをできるだけ早く OutputStream にフラッシュします。なんで?iText は、高速で低メモリ使用が不可欠な Web アプリケーションで PDF を生成するために作成されたためです。

これは、新しいページをトリガーすると、元に戻せないことを意味します。もちろん、次のようないくつかの回避策があります。

  • PdfTemplate を使用します (たとえば、最終ページを追加するまで Y がわからないため、「ページ X/Y」を追加する場合など)。
  • PDF を 2 回作成する (1 回は でPdfWriter、次に で操作するPdfStamper)
  • PdfCopy複数の PDF を作成し、それらをまたはで連結しますPdfSmartCopy

ところで、誰かがこのようにオープン アクションを使用しているのを見るのは非常に面白いことです。PDF リファレンスを読むと、開くアクションが、Adobe Reader で PDF を開くときにトリガーされるアクションであることがわかります。プログラミングがあなたの足を引っ張っている間、ページからページへ移動するために使用できると誰が言ったのか;-)

また、ドキュメントを読むことで、膨大な時間を節約できます: http://itextpdf.com/book (私はその著者です)

于 2012-12-12T14:59:00.130 に答える