一周前刚刚开始使用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
答案 0 :(得分:0)
iText(夏普)尽快将页面的所有内容刷新到OutputStream。为什么?因为iText是为了在高速和低内存使用的Web应用程序中生成PDF而编写的。
这意味着当您触发新页面时,就无法返回。当然有一些解决方法,例如
PdfWriter
,然后使用PdfStamper
进行操作)PdfCopy
或PdfSmartCopy
连接起来。顺便说一下:看到有人以这种方式使用开放式动作,这很有趣。如果您阅读PDF参考,您会发现打开操作是在Adobe Reader中打开PDF时触发的操作。无论是谁告诉你它可以用来在一个页面之间移动而编程是拉你的腿; - )
另外:您可以通过阅读文档来节省大量时间:http://itextpdf.com/book(其中我是作者)