gpt4 book ai didi

c# - 将光标或插入点移动到特定页面?

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:04 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

我添加了一些代码作为引用 - 代码是 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

最佳答案

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

这意味着当您触发一个新页面时,就无法返回。当然也有一些解决方法,比如

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

顺便说一句:看到有人以这种方式使用 open Action 非常有趣。如果您阅读过 PDF 引用,您会发现打开操作是在 Adob​​e Reader 中打开 PDF 时触发的操作。谁告诉您它可以用于在编程拖累您的同时从一个页面移动到另一个页面 ;-)

此外:您可以通过阅读文档来节省大量时间:http://itextpdf.com/book (我是作者)

关于c# - 将光标或插入点移动到特定页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13840727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com