Android PDFJet开源:如何在单元格对象内设置多行文本

Android PDFJet开源:如何在单元格对象内设置多行文本,android,Android,我使用PDFJet开源库来构建pdf。因此,我有几个问题: 1) 如何在单元格中放置多行文字 问题描述:目前我面临的问题是无法将多行文本放置在单元格对象中。我尝试设置文本,如“text1\n text2…”,但没有任何效果。不幸的是,开源版本没有TextColumn和段落类 2) 什么是CompositeTextLine以及如何使用它 问题描述:也许我想错了,但我试着做了以下几点: ... CompositeTextLine ctl = new CompositTextLine(0,0); ct

我使用PDFJet开源库来构建pdf。因此,我有几个问题:

1) 如何在单元格中放置多行文字

问题描述:目前我面临的问题是无法将多行文本放置在单元格对象中。我尝试设置文本,如
“text1\n text2…”
,但没有任何效果。不幸的是,开源版本没有TextColumn和段落类

2) 什么是CompositeTextLine以及如何使用它

问题描述:也许我想错了,但我试着做了以下几点:

...
CompositeTextLine ctl = new CompositTextLine(0,0);
ctl.addComponent(new TextLine(f1,"MyText1"));
ctl.addComponent(new TextLine(f1,"MyText2"));
ctl.addComponent(new TextLine(f1,"MyText3"));
Cell cell = new Cell(f1);
cell.setCompositeTextLine(ctl);
...
我本想在牢房里看到好几条线,但什么也没看到。此外,如果我添加行
table.wrapAroundCellText()
,我就得到了NullPointerException。如果我调用
ctl.drawin(page)
,我只会观察到:“MyText1 mytext2mytext3”而不会断行

更新:我发现了TextBox类,因此,如果我写:

TextBox textbox = new TextBox(f1);
textbox.setText("First Line \n Second Line");
textbox.drawOn(page);
它将构建我想要的:

First Line
Second Line
但我仍然对(1)的可能性和(2)的描述以及其中的一些变化感兴趣,比如“如何在单元格内设置文本框(或图像等),而不仅仅是单行?”


最后一个,请大家参考我在java或C++中实现的“文本对齐”算法。< /P> < P>我可以跨越同一个问题,我最终扩展了单元格,并使用了: 您可以像使用单元格一样实例化和添加Multilecell:

List<Cell> rowCells = new ArrayList<Cell>();
rowCells.add(new MultilineCell(font, c.getString(reasonIdx), 42));

PDFJet是一个有趣的库,顺便说一句:受保护的字段,每一个其他方法都会引发异常,而且这些类肯定不是为扩展而设计的,即使它们不是final。

有一个棘手的解决方案: 如前所述,将输入拆分为几行(例如使用ApacheCommonsLang3中的WordUtils)

在有了
行之后
,使用这些单独的行向表中添加尽可能多的行。
模拟“多行单元格”调用函数
removeLineBetweenRows
提供添加行的索引。它看起来就像一个大电池。

谢谢。从apache复制了WordUtils.wrap(),替换了对System.LINE_SEPARATOR的调用,并在Cell protected中创建了一些字段……感谢您的想法!只需在文本x坐标中更改一些:
(字符串行:行){float x_text=0;切换(align){case align.LEFT:x_text=x+this.LEFT_padding;break;case align.CENTER:x_text=x+(this.width/2-this.font.stringWidth(line)/2);break;case align.RIGHT:x_text=x+(this.width-this.font.stringWidth(line))-this.right_padding;}page.drawString(this.font,line,x_text,y_text);y_text+=this.font.getBodyHeight();}
@HiXoid:您可能应该对答案进行编辑,注释中的代码根本不可读:)
List<Cell> rowCells = new ArrayList<Cell>();
rowCells.add(new MultilineCell(font, c.getString(reasonIdx), 42));
/**
 * Auto adjusts the widths of all columns so that they are just wide enough to hold the text without truncation.
 */
private static void autoAdjustColumnWidths(List<List<Cell>> tableData) {
    // Find the maximum text width for each column
    float[] max_col_widths = new float[tableData.get(0).size()];
    for (int i = 0; i < tableData.size(); i++) {
        List<Cell> row = tableData.get(i);
        for (int j = 0; j < row.size(); j++) {
            Cell cell = row.get(j);
            if (cell.getColSpan() == 1) {
                float cellWidth = 0f;
                if (cell.getImage() != null) {
                    cellWidth = cell.getImage().getWidth();
                }
                if (cell.getText() != null) {
                    // Is this a multiline cell? If so, measure the widest line
                    if (cell.getText().contains(MultilineCell.NEW_LINE)) {
                        String[] lines = cell.getText().split(MultilineCell.NEW_LINE);
                        for (String line : lines) {
                            if (cell.getFont().stringWidth(cell.getFallbackFont(), line) > cellWidth) {
                                cellWidth = cell.getFont().stringWidth(cell.getFallbackFont(), line);
                            }
                        }
                    }
                    // Standard (single-line) cell, measure whole text
                    else {
                        if (cell.getFont().stringWidth(cell.getFallbackFont(), cell.getText()) > cellWidth) {
                            cellWidth = cell.getFont().stringWidth(cell.getFallbackFont(), cell.getText());
                        }
                    }
                }
                cell.setWidth(cellWidth + 2f /*cell.left_padding*/ + 2f/*cell.right_padding*/);
                if (max_col_widths[j] == 0f ||
                        cell.getWidth() > max_col_widths[j]) {
                    max_col_widths[j] = cell.getWidth();
                }
            }
        }
    }

    for (int i = 0; i < tableData.size(); i++) {
        List<Cell> row = tableData.get(i);
        for (int j = 0; j < row.size(); j++) {
            Cell cell = row.get(j);
            cell.setWidth(max_col_widths[j]);
        }
    }
}
String wrappedText = WrapUtil.wrap(super.getText(), this.characterCount);
 String[] lines = wrappedText.split(System.getProperty("line.separator"));