如何使用 itext 7 确定列号
How do I determine column number using itext 7
我使用 itext 7 及其 ColumnDocumentRenderer 创建了文档。我想将一些文本强制放入最后一列。 "last column" 我的意思是,例如,如果我有一个由 ColumnDocumentRenderer 定义的页面有 3 列,但我只有一列文本,我仍然希望第 3 列包含我的强制值。所以我想(假设一个解决方案,其他人表示赞赏)我需要一种机制来知道我所在的列号并强制列中断。由于 Whosebug 希望以问题的形式提出这个问题,(a) 这些机制是什么?以及 (b) 有哪些替代方法?
问题 How to skip text insertion point to the next column using iText? 显然提出了类似的问题,但显然使用的是较早版本的 itext;我的没有我能找到的 ColumnText。
在此先感谢您的帮助。
我昨天在 phone 上回答,但现在我可以访问计算机,我将 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());
我使用 itext 7 及其 ColumnDocumentRenderer 创建了文档。我想将一些文本强制放入最后一列。 "last column" 我的意思是,例如,如果我有一个由 ColumnDocumentRenderer 定义的页面有 3 列,但我只有一列文本,我仍然希望第 3 列包含我的强制值。所以我想(假设一个解决方案,其他人表示赞赏)我需要一种机制来知道我所在的列号并强制列中断。由于 Whosebug 希望以问题的形式提出这个问题,(a) 这些机制是什么?以及 (b) 有哪些替代方法?
问题 How to skip text insertion point to the next column using iText? 显然提出了类似的问题,但显然使用的是较早版本的 itext;我的没有我能找到的 ColumnText。
在此先感谢您的帮助。
我昨天在 phone 上回答,但现在我可以访问计算机,我将 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());