Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在iText中将多列文本转换为列文本?_Java_Itext - Fatal编程技术网

Java 如何在iText中将多列文本转换为列文本?

Java 如何在iText中将多列文本转换为列文本?,java,itext,Java,Itext,这是我使用OpenPDF(iText4的旧版本)的代码。我在网上搜索可能的解决方案,但ColumnText的所有实现都令人困惑。我也试图实现它,但没有得到预期的结果 MultiColumnText mct = new MultiColumnText(); mct.addReguarColumns(document.left(), document.right(), column.gutter, column.colNum); Paragraph p = new Paragraph("Testin

这是我使用OpenPDF(iText4的旧版本)的代码。我在网上搜索可能的解决方案,但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);
这是多栏文本。现在,我正在测试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();
}
}

但结果却是一团糟。我遗漏了什么吗?

请查看官方文档,更具体地说是本节中的常见问题

在对这个问题的回答中,它说:

如果您可以在不同的页面上分发内容,则不需要 在模拟模式下,只需插入一个文档即可

在本例中,
rect
包含矩形的坐标

诚然,在本例中,每个页面只有一个矩形,但您可以很容易地修改如下代码:

如果您可以在不同的页面上分发内容,则不需要模拟模式,只需插入一个文档即可

}


在本例中,
rect[]
是两个
Rectangle
对象的数组,一个用于左列,一个用于右列。

请注意,iText 4从未存在过。它是(错误地)由与iText没有任何关联的第三方发布的,该第三方(错误地)使用了属于iText的项目ID。如果升级到iText 7是一个选项:升级到iText 7,并使用
ColumnDocumentRenderer
,如中所述。如果你想在商业环境中使用iText,你必须升级,因为除了iText 4的法律问题外,显然还有你遇到的技术问题。发布iText4的人基于2009年7月发布的iText版本。我希望您理解,在过去9年发布的后续版本中,许多技术问题都得到了解决。我投票结束了这个问题,因为你不能指望2009年开始的非官方版本会得到支持,那时你可以从2018年升级到一个版本来解决你的问题。iText 5呢?如果我必须切换到iText 7,那么我将不得不改变很多。同样,上面提到的iText4,我指的是OpenPDF(它说的是iText4的一个分支)。我们可以用iText 5修复上面的代码吗?另外,我现在正处于测试阶段,所以如果我喜欢这个库,我会买下它。我知道你是作者,但我需要看看我在做什么。哈哈哈,OpenPDF是个笑话。这是一个开发人员发布的版本,他对PDF和iText了解不够,无法解决您遇到的问题。iText 5不再免费受支持(只有付费客户才能获得支持),但
setSimpleColumn()
方法接受
矩形
对象作为参数这一事实使事情变得更简单。您的段落太小,无法测试代码。我将根据官方文档提供答案(奇怪的是,你参考的是C#示例而不是官方常见问题解答)。我只是好奇,但从iText 5切换到iText 7有多容易?语法非常不同,但处理对象更直观。很难告诉你这有多容易或有多困难,因为这取决于你的项目的大小,以及你正在使用的功能。你好,布鲁诺,我决定升级到iText7,它确实修复了我的专栏。但是,我现在有一个小问题。你能帮我做这个吗?
ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(rect);
int status = ct.go();
while (ColumnText.hasMoreText(status)) {
    document.newPage();
    ct.setSimpleColumn(rect);
    status = ct.go();
}
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();