我是從我的電話接聽昨天,但現在,我有機會獲得一臺電腦,我改變ColumnDocumentRenderer
這樣的:
public class ColumnDocumentRenderer extends DocumentRenderer {
protected Rectangle[] columns;
protected int nextAreaNumber;
public ColumnDocumentRenderer(Document document, Rectangle[] columns) {
super(document);
this.columns = columns;
}
public ColumnDocumentRenderer(Document document, boolean immediateFlush, Rectangle[] columns) {
super(document, immediateFlush);
this.columns = columns;
}
@Override
protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
if (overflowResult != null && overflowResult.getAreaBreak() != null && overflowResult.getAreaBreak().getType() != AreaBreakType.NEXT_AREA) {
nextAreaNumber = 0;
}
if (nextAreaNumber % columns.length == 0) {
super.updateCurrentArea(overflowResult);
}
return (currentArea = new LayoutArea(currentPageNumber, columns[nextAreaNumber++ % columns.length].clone()));
}
public int getNextAreaNumber() {
return nextAreaNumber;
}
}
的變化將是iText的7.0.1,但你可以使用這個代碼在你自己的渲染器中。
現在可以使用此渲染器是這樣的:
public void createPdf(String dest) throws IOException {
OutputStream fos = new FileOutputStream(dest);
PdfWriter writer = new PdfWriter(fos);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
float offSet = 36;
float gutter = 23;
float columnWidth = (PageSize.A4.getWidth() - offSet * 2)/3 - gutter * 2;
float columnHeight = PageSize.A4.getHeight() - offSet * 2;
Rectangle[] columns = {
new Rectangle(offSet, offSet, columnWidth, columnHeight),
new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight),
new Rectangle(offSet + 2 * (columnWidth + gutter), offSet, columnWidth, columnHeight)};
ColumnDocumentRenderer renderer = new ColumnDocumentRenderer(document, columns);
document.setRenderer(renderer);
for (int i = 0; i < 50; i++) {
document.add(new Paragraph("Hello World"));
}
while (renderer.getNextAreaNumber() % 3 != 0)
document.add(new AreaBreak());
document.add(new Paragraph("Third column"));
document.add(new AreaBreak());
for (int i = 0; i < 80; i++) {
document.add(new Paragraph("Hello World"));
}
while (renderer.getNextAreaNumber() % 3 != 0)
document.add(new AreaBreak());
document.add(new Paragraph("Third column"));
document.add(new AreaBreak());
for (int i = 0; i < 10; i++) {
document.add(new Paragraph("Hello World"));
}
while (renderer.getNextAreaNumber() % 3 != 0)
document.add(new AreaBreak());
document.add(new Paragraph("Third column"));
document.close();
}
中第一列的索引0和下一個區域數爲1,第二列具有索引1和下一個區域編號是2,所以上。
這意味着,你可以檢查並轉到第三列這樣的頁面上。
while (renderer.getNextAreaNumber() % 3 != 0)
document.add(new AreaBreak());
我會創建自己的渲染器。跟蹤的列的作爲[文檔】在完成(http://developers.itextpdf.com/content/itext-7-building-blocks/chapter-2-working-rootelement),更具體而言,我會覆蓋'updateCurrentArea()'方法並顯示'currentAreaNumber'。在添加進入第三列的內容並根據需要添加儘可能多的「AreaBreak」對象之前,我會檢查該數字。注意:由於某種原因,'currentAreaNumber'變量是'private'。我很想讓它「受保護」。 –
我非常感謝鏈接到文檔。我通過itext站點跟蹤了各種鏈接,但從未找到特定於itext7的文檔。再次感謝。 – OldAndTired
完美工作 – OldAndTired