【问题标题】:How do we convert MultiColumnText to ColumnText in iText?我们如何在 iText 中将 MultiColumnText 转换为 ColumnText?
【发布时间】:2018-06-19 20:34:31
【问题描述】:

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

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

【问题讨论】:

  • 请注意,iText 4 从未存在过。它是(错误地)由与 iText 无关的第三方(错误地)发布的,他们(错误地)使用了属于 iText 的项目 ID。如果可以选择升级到 iText 7:升级到 iText 7,并使用ColumnDocumentRenderer,如tutorial 中所述。如果你想在商业环境中使用 iText,无论如何你都必须升级,因为versions older than iText 5 have legal issues.
  • 除了 iText 4 的法律问题外,您显然还遇到了技术问题。发布 iText 4 的人是基于 2009 年 7 月发布的 iText 版本发布的。我希望您了解,在过去 9 年发布的后续版本中解决了许多技术问题。我投票结束了这个问题,因为当你可以通过升级到 2018 年的版本来解决你的问题时,你不能期望从 2009 年开始的非官方版本得到支持。
  • iText 5 怎么样?如果我必须切换到 iText 7,那么我将不得不进行很多更改。另外,上面的 iText 4 是指 OpenPDF(它说是 iText 4 的一个分支)。我们可以使用 iText 5 修复上述代码吗?另外,我现在处于测试阶段,所以如果我喜欢这个图书馆,我会买它。我知道你是作者,但我需要看看我在做什么。
  • 哈哈哈,OpenPDF就是个笑话。这是一个开发人员发布的版本,他对 PDF 和 iText 了解不足,无法解决您遇到的问题。不再免费支持 iText 5(只有付费客户才能获得支持),但 setSimpleColumn() 方法接受 Rectangle 对象作为参数这一事实使事情变得更容易。您的段落太小,无法测试您的代码。我将根据官方文档提供答案(奇怪的是您参考 C# 示例而不是参考官方常见问题解答)。

标签: java itext openpdf


【解决方案1】:

请查看官方文档,更具体地说是Absolute positioning of text 部分中的常见问题解答问题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 对象的数组,一个用于左列,一个用于右列。

【讨论】:

  • 我只是好奇,但是从 iText 5 切换到 iText 7 有多容易?
  • 语法有很大不同,但处理对象更直观。不可能告诉您它有多容易或有多困难,因为这完全取决于您的项目规模以及您使用的功能。
  • 嗨 Bruno,我决定升级到 iText7,它确实修复了我的列。但是,我现在有一个小问题。你能帮我解决这个问题吗? stackoverflow.com/questions/51084709/…
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2016-01-22
  • 2018-10-09
  • 1970-01-01
  • 2022-06-24
  • 2012-08-01
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多