Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
iText--如何获得文本的渲染维度?_Itext - Fatal编程技术网

iText--如何获得文本的渲染维度?

iText--如何获得文本的渲染维度?,itext,Itext,我想了解有关PdfPCell中文本布局的信息。我知道BaseFont.getWidthPointKerned,但我正在寻找更详细的信息,如: 如果在一个给定宽度的单元格中渲染一个字符串需要多少行,比如说,30磅?PdfPCell的点高度是多少 给我一个字符串的前缀或后缀,它适合给定宽度和高度的单元格。也就是说,如果我必须在宽度为12pt、高度为20pt的PdfPCell中以特定字体呈现文本,那么字符串的哪一部分将适合可用空间 当被要求在给定宽度的单元格中呈现给定字符串时,iText在哪里中断该字

我想了解有关PdfPCell中文本布局的信息。我知道BaseFont.getWidthPointKerned,但我正在寻找更详细的信息,如:

如果在一个给定宽度的单元格中渲染一个字符串需要多少行,比如说,30磅?PdfPCell的点高度是多少

给我一个字符串的前缀或后缀,它适合给定宽度和高度的单元格。也就是说,如果我必须在宽度为12pt、高度为20pt的PdfPCell中以特定字体呈现文本,那么字符串的哪一部分将适合可用空间

当被要求在给定宽度的单元格中呈现给定字符串时,iText在哪里中断该字符串

这与iText 2.1.6有关。谢谢。

iText使用ColumnText类向单元格呈现内容。这在我98-99页的书中有解释。这意味着,就像ColumnText一样,您需要区分文本模式和复合模式

在任何情况下,ColumnText都会测量字符的宽度,并测试它们是否适合可用宽度。否则,将拆分文本。您可以通过不同的方式更改拆分行为:引入连字符或定义自定义拆分字符

我已经写了一个小的概念证明来展示如何实现自定义截断行为。参见示例

我没有将内容添加到单元格中,而是定义了一个单元格事件的空单元格。我认为长文本D2是一个单元格,其内容超过了我们在单元格中的容纳量。对这一事件的关注

事件中,我使用了一种奇特的算法:我希望文本在中间被截断并插入…在我截断文本的地方

BaseFont bf = BaseFont.createFont();
Font font = new Font(bf, 12);
float availableWidth = position.getWidth();
int contentLength = content.length();
int leftChar = 0;
int rightChar = contentLength - 1;
availableWidth -= bf.getWidthPoint("...", 12);
while (leftChar < contentLength && rightChar != leftChar) {
    availableWidth -= bf.getWidthPoint(content.charAt(leftChar), 12);
    if (availableWidth > 0)
        leftChar++;
    else
        break;
    availableWidth -= bf.getWidthPoint(content.charAt(rightChar), 12);
    if (availableWidth > 0)
        rightChar--;
    else
        break;
    }
    String newContent = content.substring(0, leftChar) + "..." + content.substring(rightChar);
    PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
    ColumnText ct = new ColumnText(canvas);
    ct.setSimpleColumn(position);
    ct.addElement(new Paragraph(newContent, font));
    ct.go();
如您所见,我们从position参数中获得可用宽度,并检查匹配的字符数,在内容开头的字符和结尾的字符之间交替

结果如所示:内容被截断如下:D2是一个c。。。牢房


你的问题是,有多少行可以用类似的方法解决。ColumnText类有一个getLinesWrite方法,可以提供该信息。您可以在我对另一个问题的回答中找到有关定位ColumnText对象的更多信息:

是否有限制提问速度的政策?顺便说一句,我已经使用iText好几个月了。只是我决定立刻问我的问题,而不是把它们运走。我查看了BaseFont中的其他方法,以查看是否有提供此信息的方法,但没有。对于其他问题,我已演示了我尝试的方法,例如:。这本书描述了这个问题,描述了我到目前为止是如何部分解决的,并提出了我下一步可以做什么的建议。在这种情况下,我想不出还有什么可以尝试的,因为没有合适的API方法可以尝试。我不是要求别人教我,也不是要求别人帮我做作业。关于您的代码请求,我可以给您提供用于拆分列的代码,但这不仅仅是帮助,而且会让您感到困惑。拆分列不适用于此问题,而是适用于。你的评论适用于这个问题还是相关问题?谢谢。谢谢你关于PdfTemplate的提示。我会试试看。关于你的另一点,我已尽力提出具体、详细的问题。不知道如何设置行高?哪一个是家庭作业/新手问题,但setMinimumHeight和setFixedHeight是如何相互作用的?我用过iText,读过API文档,尝试过一些东西,等等。但是你却急忙责怪我没有读这本书,却没有意识到这本书没有回答你提出的问题。如果你不想帮助我,这取决于你:哦,谢谢你构建了iText,我从中受益匪浅:而且,作为一个一般性的提示,如果你发现一个具体的问题令人困惑,请让我知道它的哪个方面令人困惑,我可以发布代码来说明这个方面。简单地发布代码来覆盖所有内容会让页面变得混乱而不是澄清。谢谢,布鲁诺。我会很快读完你的三个答案,然后再给你回复。这个答案的一部分已经被复制了。@KartickVaddadi回答问题是我的荣幸。它一次又一次地证明,iText的人真的知道他们的东西。不幸的是,贵公司的一些人过去给我做过虚假的承诺。不信守诺言并不是我认为值得尊敬的事情,所以我希望贵公司在经过多年的拖延之后,最终会做正确的事情。我不知道我公司的其他人有哪些或没有承诺过什么,以及在什么情况下,等等,所以我不想重提那些。让我们专注于技术讨论,好吗?不,那不好。作为开发人员,您有责任做正确的事情。您应该一直等到支持合同生效。我为你的公司等了5年了 如果你想成为一名客户,你当然应该能够等到合同签订后再去。我在等待贵公司迈出这一步,而不是相反!