Дело в том, что в начале страницы элементы должны быть нарисованы в одном столбце, а после этого элементы на той же странице должны быть нарисованы в двух столбцах.
Пока что, согласно iText например « c02e10_jekyllhydev6 », я просто могу переключать разные средства визуализации между страницами, что означает сначала применение DocumentRenderer, затем добавление AreaBreak of Next Page и применение 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, содержимое с разными модулями визуализации будет перекрываться.
Из комментария Алексея в this case , кажется возможным, что переключение разных рендереров на одной странице без перекрытия контента.
Чтобы справиться с этим соответствующим образом, вам нужно будет обновить currentArea из рендерер, на который вы собираетесь переключиться с currentArea предыдущего рендерера, с которым вы только что закончили работать. Вы можете сделать это, расширив стандартные предоставленные средства визуализации или вызвав renderer.getCurrentArea () и изменив bBox.
Но я не знаю, как этого добиться в соответствии с приведенными выше руководствами.