这是我使用OpenPDF(iText 4的旧版本)的代码。我在线搜索了可能的解决方案,但ColumnText的所有实现都令人困惑。我也尝试实现它,但是没有得到预期的结果。
MultiColumnText mct = new MultiColumnText();
mct.addReguarColumns(document.left(), document.right(), column.gutter, column.colNum);
Paragraph p = new Paragraph("Testing");
mct.addElement(p);
document.add(mct);
这与MultiColumnText有关。现在,我正在测试iText 5,发现MultiColumnText已删除。我在这里看到了一个关于C#的问题,我将代码更改为以下代码以支持ColumnText:
ColumnText mct = new ColumnText(writer.getDirectContent());
float middle = (document.left() + document.right()) / 2;
float[][] COLUMNS = {
{ document.left(), document.bottom(), middle - 15, document.top() } ,
{ middle + 15, document.bottom(), document.right(), document.top() }
};
Paragraph p = new Paragraph("Testing");
mct.addElement(p);
int col = 0;
int count = 0;
int status = ColumnText.START_COLUMN;
while (ColumnText.hasMoreText(status)) {
mct.setSimpleColumn(
COLUMNS[col][0], COLUMNS[col][1],
COLUMNS[col][2], COLUMNS[col][3]);
status = mct.go();
if (++count > 1) {
count = 0;
document.newPage();
}
}
但是输出混乱。我在这里想念东西吗?
答案 0 :(得分:0)
请查看官方文档,尤其是How to fit a String inside a rectangle?部分中的FAQ问题Absolute positioning of text。
在该问题的答案中,它说:
如果您可以将内容分发到不同的页面上,则不需要 模拟模式,您只需要插入一个document.newPage();
ColumnText ct = new ColumnText(cb); ct.setSimpleColumn(rect); int status = ct.go(); while (ColumnText.hasMoreText(status)) { document.newPage(); ct.setSimpleColumn(rect); status = ct.go(); }
在此示例中,
rect
包含矩形的坐标。
在此示例中,当然,每个页面只有一个矩形,但是您可以轻松地修改如下代码:
如果您可以在不同页面上分发内容,则不需要模拟模式,只需插入document.newPage();
ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(rect[0]);
ct.go();
ct.setSimpleColumn(rect[1]);
int status = ct.go();
while (ColumnText.hasMoreText(status)) {
document.newPage();
ct.setSimpleColumn(rect[0]);
ct.go();
ct.setSimpleColumn(rect[1]);
status = ct.go();
}
在此示例中,rect[]
是两个Rectangle
对象的数组,一个对象用于左列,一个对象用于右列。