如何在iText中将MultiColumnText转换为ColumnText?

时间:2018-06-19 20:34:31

标签: java itext

这是我使用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();
}
}

但是输出混乱。我在这里想念东西吗?

1 个答案:

答案 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对象的数组,一个对象用于左列,一个对象用于右列。