使用iTextSharp如何删除已创建并添加到文档的PdfPTable?
问题根因
你调用DeleteBodyRows等方法不生效的核心原因是:iTextSharp 采用流式生成PDF的设计,当你执行targetDocument.Add(table)后,表格的所有渲染数据已经被写入到PDF输出流中,此时你再修改内存里的PdfPTable对象,不会对已经生成的PDF内容产生任何影响。
你提到的几个行删除方法,仅在表格还未被添加到Document实例前修改表格结构时生效,添加后操作无效。iTextSharp 也没有提供Delete/Remove这类直接删除已添加到文档的元素的接口。
可行解决方案
方案1:先校验页码再添加表格(最优)
调整逻辑顺序,先完成页码变化判断,确认需要保留表格时再将其添加到文档中,从根源避免需要删除已添加元素的场景,示例逻辑如下:
Private Sub CreatePDFDocument_AddTitleTable(ByRef targetDocument As Document, ByVal TargetString As String, ByVal needAddTable As Boolean) Dim table As PdfPTable = New PdfPTable(1) ' 省略你的表格样式、单元格添加逻辑 table.AddCell(New Paragraph(New Chunk(TargetString, Font12Bold))) ' 先判断是否需要添加,符合条件再加 If needAddTable Then targetDocument.Add(table) End If End Sub
你可以在调用这个方法前先计算页码是否变化,将结果作为needAddTable参数传入即可。
方案2:单页内容缓存校验
如果你的业务逻辑必须先渲染内容再判断页码,可以为单页内容创建临时MemoryStream缓存,校验页码符合要求后再将缓存内容写入正式文档,不符合直接丢弃当前页缓存即可,不需要重建整个文档,成本远低于你的备选方案。
方案3:使用PdfStamper修改已生成PDF
如果PDF已经完整生成,需要删除指定页面上的表格,可以用PdfStamper读取PDF文件,定位对应页的内容流,擦除表格对应的绘制指令,该方案实现复杂度较高,仅适合处理已生成的存量PDF文件时使用。
内容的提问来源于stack exchange,提问作者Jarron
相关产品推荐
相关产品推荐

