【问题标题】:Move Cursor or Insertion Point To A Specific Page?将光标或插入点移动到特定页面?
【发布时间】:2012-12-12 13:19:00
【问题描述】:

一周前刚开始使用 iTextSharp - 你会认为有些事情是显而易见的,但显然不是。

我想在使用 PDFWriter 添加动态内容之前创建一个 PDF 报告结构(即线条、图像和静态文本)。此报告模板将用于三种类型的报告。

这意味着,我构建了页面,然后我想返回第 1 页并添加一些新内容,然后转到第 2 页并添加更多内容,然后转到第 3 页,依此类推。我会提前确定我需要的页数构建模板,然后添加额外的内容。

创建页面没有问题。使用 GotoLocalPage 返回第 1 页(或我可能想要调用的任何页面)没有问题。但是我想添加的所有新的直接内容都在最后一页结束。

如何将光标或插入点(由于缺乏知识)移动到任何前一页并开始添加新内容?

我尝试过大纲、书签、锚点,但它们似乎都在向页面添加文本 - 诸如不可见的锚点之类的东西(即,使用空字符串?)

我不想关闭文档并重新打开以添加其他内容 - 应该有一种方法可以移动到文档的任何给定部分并添加其他内容。

我添加了一些代码作为参考 - 代码是 VB.net,但我在解释 Java 或 C# 时没有任何问题 - 抱歉,我无法添加图片 StackFlow 不允许我添加,因为我是新手!

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

【问题讨论】:

    标签: c# java vb.net itextsharp


    【解决方案1】:

    iText(Sharp) 将页面的所有内容尽快刷新到 OutputStream。为什么?因为 iText 是为在高速和低内存使用至关重要的 Web 应用程序中生成 PDF 而编写的。

    这意味着当您触发一个新页面时,就没有回头路了。当然也有一些变通方法,比如

    • 使用 PdfTemplate(例如添加“第 X 页,共 Y”,因为您通常在添加最后一页之前不知道 Y)。
    • 分两次创建 PDF(一次使用 PdfWriter,然后使用 PdfStamper 操作)
    • 创建多个 PDF,然后将它们与 PdfCopyPdfSmartCopy 连接。

    顺便说一句:看到有人以这种方式使用开放动作是很有趣的。如果您阅读过 PDF 参考资料,您会发现打开操作是在 Adob​​e Reader 中打开 PDF 时触发的操作。谁告诉你它可以用来在编程时从一个页面移动到另一个页面;-)

    另外:您可以通过阅读以下文档为自己节省大量时间:http://itextpdf.com/book(我是其中的作者)

    【讨论】:

    • 布鲁诺,感谢您的帮助。我确实购买了你的书,这是一个很好的参考。我一周前才开始使用 iTextSharp(我喜欢它),所以我仍然处于陌生的领域。我可以在构建每个页面时添加动态内容,因为在创建 PDF 之前我已经确定了所需的数据(只是想将每个流程层与另一个隔离,而不是在调试会话期间向下钻取 - 我可以关闭和打开流程,如所须)。但是既然您已经指出会发生刷新内容,我的最初意图需要修改。再次,谢谢!
    • 您的设计需要更改,但如果您使用我建议的解决方法之一,您的初始意图仍然可以保留 ;-)
    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 2022-10-11
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多