0

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

但是输出是一团糟。我在这里错过了什么吗?

4

1 回答 1

0

请查看官方文档,更具体地说是常见问题解答问题How to fit a String inside a rectangle?文本的绝对定位部分

在回答这个问题时,它说:

如果可以将内容分布到不同的页面,就不需要模拟模式,只需要插入一个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,一个用于左列,一个用于右列。

于 2018-06-19T22:37:44.267 回答