iText7如何切换DocumentRenderer并在上次渲染结束位置继续排版
iText7切换DocumentRenderer实现双栏转单栏无重叠渲染方案
问题根因
直接实例化新的DocumentRenderer时,渲染器的默认排版起始位置为当前页的顶部,不会继承前一个ColumnDocumentRenderer的结束坐标,因此会出现新旧内容重叠的问题。
修复后的实现代码
using (MemoryStream oDocumentStream = new MemoryStream()) { using (PdfWriter oDocumentWriter = new PdfWriter(oDocumentStream).SetSmartMode(true)) { PdfDocument pdfDocument = new PdfDocument(oDocumentWriter); Document document = new Document(pdfDocument); float offSet = 60; float columnWidth = (PageSize.A4.GetWidth() - offSet * 2 + 10) / 2; float columnHeight = PageSize.A4.GetHeight() - offSet * 2; // 定义双栏区域 Rectangle[] columns = new Rectangle[] { new Rectangle(offSet - 5, offSet, columnWidth, columnHeight), new Rectangle(offSet + columnWidth, offSet, columnWidth, columnHeight) }; // 初始化双栏渲染器,渲染双栏内容 var columnRenderer = new ColumnDocumentRenderer(document, columns); document.SetRenderer(columnRenderer); document.Add(myparagraph); // 记录双栏渲染结束的位置 var currentArea = columnRenderer.GetCurrentArea(); float lastY = currentArea.GetBBox().GetY(); int lastPage = currentArea.GetPageNumber(); // 初始化单栏渲染器 var singleRenderer = new iText.Layout.Renderer.DocumentRenderer(document); document.SetRenderer(singleRenderer); // 手动设置单栏渲染的起始位置与双栏结束位置对齐 if (lastY > offSet) // 校验当前页剩余空间足够继续排版 { var newLayoutArea = new LayoutArea(lastPage, new Rectangle( offSet, offSet, PageSize.A4.GetWidth() - offSet * 2, lastY - offSet )); singleRenderer.SetCurrentArea(newLayoutArea); } // 渲染单栏内容 document.Add(myparagraph); document.Close(); } oPdfFile = oDocumentStream.ToArray(); }
注意事项
- 如果需要双栏结束后单栏内容强制从新页开始,不需要手动设置渲染位置,只需要在切换渲染器前添加
document.Add(new AreaBreak());即可,新的渲染器会自动从新页顶部开始排版。 - 代码中的边距参数需要和你全局设置的文档边距保持一致,如果有自定义边距要对应调整数值。
- 双栏内容跨多页时也可以正常生效,
GetCurrentArea方法会自动获取最后一页的渲染结束坐标。
内容的提问来源于stack exchange,提问作者ihavenokia
相关产品推荐
相关产品推荐

