【发布时间】:2020-06-17 17:10:53
【问题描述】:
情况是,在Page的开头,Elements应该在一列中绘制,之后,同一页面中的元素应该在两列中绘制。
到目前为止,根据iText示例“c02e10_jekyllhydev6”,我只是可以在页面之间切换不同的渲染器,即首先应用DocumentRenderer,然后添加下一页的AreaBreak,并在新页面中应用ColumnDocumentRenderer。
代码:
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc, PageSize.A4);
doc.SetMargins(36, 36, 36, 36);
Paragraph p = new Paragraph();
p.SetBorder(new SolidBorder(0.5f));
for (int i = 1; i <= 500; i++)
{
p.Add(new Text(i + " "));
}
doc.Add(p);
**doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));**
PageSize ps = PageSize.A4;
var effectiveArea = doc.GetPageEffectiveArea(PageSize.A4);
float columnHeight = effectiveArea.GetHeight();
//Define column areas
Rectangle[] columns = new Rectangle[] {
new Rectangle(36, 36, 200, columnHeight),
new Rectangle(36 + 200 + 20, 36, effectiveArea.GetWidth()- 200 - 20, columnHeight)
};
ColumnDocumentRenderer renderer1 = new ColumnDocumentRenderer(doc, new Rectangle[] { columns[0] });
doc.SetRenderer(renderer1);
**doc.Add(new AreaBreak(AreaBreakType.LAST_PAGE));**
Paragraph p1 = new Paragraph();
p1.SetBorder(new SolidBorder(0.5f));
for (int i = 1; i <= 500; i++)
{
p1.Add(new Text(i + " "));
}
doc.Add(p1);
ColumnDocumentRenderer renderer2 = new ColumnDocumentRenderer(doc, new Rectangle[] { columns[1] });
doc.SetRenderer(renderer2);
Paragraph p2 = new Paragraph();
for (int i = 1; i <= 1000; i++)
{
p2.Add(new Text(i + " "));
}
doc.Add(p2);
doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
DocumentRenderer renderer3 = new DocumentRenderer(doc);
doc.SetRenderer(renderer3);
doc.Add(new AreaBreak(AreaBreakType.LAST_PAGE));
Paragraph p3 = new Paragraph();
for (int i = 1; i <= 1000; i++)
{
p3.Add(new Text(i + " "));
}
doc.Add(p3);
doc.Close();
如果文档中没有添加AreaBreak,不同渲染器的内容会重叠。
从 Alexey 在this case 的评论来看,似乎可以在同一页面中切换不同的渲染器而不会发生内容重叠。
要妥善处理此问题,您必须将要切换到的渲染器的 currentArea 更新为您刚刚完成的前一个渲染器的 currentArea。您可以通过扩展标准提供的渲染器,或调用 renderer.getCurrentArea() 并修改 bBox 来做到这一点。
但是我不知道如何根据上面的指南来实现它。
【问题讨论】: