我可以告诉iText如何剪辑文本以适应单元格

时间:2014-02-28 12:31:20

标签: itext

当我在PdfPCell上调用setFixedHeight()并添加更多文本而不是给定高度时,iText似乎打印出适合的字符串的前缀。

我可以控制此裁剪算法吗?例如:

  1. 打印字符串的后缀而不是前缀。

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

  3. 当字符串中有多个单词时,iText似乎消除了一个不适合的单词,而我希望它部分打印出来。也就是说,如果字符串是“Hello World”,并且单元格只有“Hello Wo ...”的空间,我希望在iText打印时打印而不是“Hello”。

  4. 不是完整打印字符,而是只打印部分字符。想象一下,将文本打印到PNG并切掉PNG的顶部和/或底部以使其适合可用空间。例如,请注意顶部线和底线部分被剪切:

  5. enter image description here

    这些都有可能吗? iText是否可以控制文本的剪切方式?感谢。

    这是参考iText 2.1.6。

2 个答案:

答案 0 :(得分:1)

我写了一个概念验证ClipCenterCellContent,我们试图将文本"D2 is a cell with more content than we can fit into the cell."放在一个太小的单元格中。

就像你的另一个问题(iText -- How do I get the rendered dimensions of text?)一样,我们使用单元格事件添加内容,但我们现在添加两次:一次在模拟模式下(以找出需要垂直的空间)和一次for real(使用偏移量)。

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

PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
ColumnText ct = new ColumnText(canvas);
ct.setSimpleColumn(new Rectangle(0, 0, position.getWidth(), -1000));
ct.addElement(content);
ct.go(true);
float spaceneeded = 0 - ct.getYLine();
System.out.println(String.format("The content requires %s pt whereas the height is %s pt.", spaceneeded, position.getHeight()));

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

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剪辑内容。

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

答案 1 :(得分:1)

对于直接文本框剪辑,我调整了此处给出的C#代码

http://itextsharp.10939.n7.nabble.com/Limiting-Text-Width-using-PdfContentByte-td2481.html

到下面的Java代码。剪切区域最终位于此矩形之外,因此您仍然可以在相同的精确坐标上绘制矩形。

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

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