我可以告诉iText如何剪裁文本以适合单元格吗

我可以告诉iText如何剪裁文本以适合单元格吗,itext,Itext,当我在PdfPCell上调用setFixedHeight()并添加超过给定高度的文本时,iText似乎会打印匹配字符串的前缀 我可以控制这个剪辑算法吗?例如: 打印字符串的后缀而不是前缀 将字符串的子字符串标记为不删除。这是脚注参考。如果我添加的文本是“Hello World[1]”,则[1]是对脚注的引用,不应删除。可以删除字符串的其他字符,如“World” 当字符串中有多个单词时,iText似乎会删除一个不合适的单词,而我希望它部分打印出来。也就是说,如果字符串是“Hello World”,

当我在PdfPCell上调用setFixedHeight()并添加超过给定高度的文本时,iText似乎会打印匹配字符串的前缀

我可以控制这个剪辑算法吗?例如:

  • 打印字符串的后缀而不是前缀

  • 将字符串的子字符串标记为不删除。这是脚注参考。如果我添加的文本是“Hello World[1]”,则[1]是对脚注的引用,不应删除。可以删除字符串的其他字符,如“World”

  • 当字符串中有多个单词时,iText似乎会删除一个不合适的单词,而我希望它部分打印出来。也就是说,如果字符串是“Hello World”,并且单元格中只有“Hello Wo…”的空间,那么我希望打印该字符串,而不是像iText打印的那样仅打印“Hello”

  • 与其打印整个字符,不如只打印部分字符。想象一下,将文本打印为PNG,然后将PNG的顶部和/或底部切掉,以使其适合可用空间。例如,请注意,此处部分剪裁了顶线和底线:

  • 这些都有可能吗?iText能让我控制文本的剪辑方式吗?谢谢


    这是关于iText 2.1.6的。

    我写了一个概念证明,其中我们尝试将文本
    放入“D2是一个单元格,其内容超出了我们可以放入单元格的范围。”
    放入一个太小的单元格中

    就像在您的另一个问题()中一样,我们使用单元格事件添加内容,但现在我们添加了两次:一次在模拟模式下(以了解垂直方向需要多少空间),一次在真实模式下(使用偏移量)

    这将在模拟模式下添加内容(我们使用单元格的宽度和任意高度):

    现在我们知道了所需的高度,可以使用偏移量添加真实内容:

    float offset = (position.getHeight() - spaceneeded) / 2;
    System.out.println(String.format("The difference is %s pt; we'll need an offset of %s pt.", -2f * offset, offset));
    PdfTemplate tmp = canvas.createTemplate(position.getWidth(), position.getHeight());
    ct = new ColumnText(tmp);
    ct.setSimpleColumn(0, offset, position.getWidth(), offset + spaceneeded);
    ct.addElement(content);
    ct.go();
    canvas.addTemplate(tmp, position.getLeft(), position.getBottom());
    
    在本例中,我使用了
    PdfTemplate
    来剪辑内容


    我也有你其他问题的答案,但我现在没有时间回答。

    对于直接文本框剪辑,我修改了这里给出的C代码

    请参阅下面的Java代码。剪切区域结束于该矩形之外,因此您仍然可以在相同的精确坐标上绘制矩形

    cb.saveState(); 
    cb.rectangle(left,top,width,height); 
    cb.clip(); 
    cb.newPath(); 
    // perform clipped output here 
    cb.restoreState(); 
    

    我使用try/finally确保调用了restoreState()。

    这可以使用单元格事件来完成。换句话说:创建一个固定高度的空单元格,并在单元格事件的
    layout()
    方法中添加内容。如果你想知道为什么我不愿意给你一个代码示例:我的名字是Lowagie(你在代码中提到的那个),我希望人们停止使用iText的过时版本。谢谢你,布鲁诺。我知道你是谁:)我会试试布局()技巧。谢谢你-这是最好的解决方案。
    cb.saveState(); 
    cb.rectangle(left,top,width,height); 
    cb.clip(); 
    cb.newPath(); 
    // perform clipped output here 
    cb.restoreState();