代码 sn-p 2 是正确的(在我应用了一个小修复之后),但它只有在为表单字段定义了最大长度时才有效。通常,不会定义最大长度,在这种情况下 maxLenghtNumber 将是 null。
如果没有定义最大长度,则没有限制,因此您必须测量是否适合文本。根据您的代码 sn-p 1,您已经知道可用宽度:width。这个宽度可以容纳多少个字符取决于字体大小和字符。字符的宽度取决于字体。
这是一个额外的代码sn-p:
TextField tx = new TextField(writer, null, null);
fields.decodeGenericDictionary(mergedFieldDictionary, tx);
float size = tx.getFontSize();
BaseFont basefont = tx.getFont();
如果字体是等宽字体,很容易知道有多少字符适合宽度。在这种情况下,获取单个字形的宽度(例如w)并将总宽度除以字形宽度就足够了:width / w。
通常,字体具有成比例的宽度,使您的问题无法回答。例如:"IIIIIIIIII"的宽度小于"WWWWWWWWWW"的宽度 在这两种情况下,我们都有10个字符,但是一个I 不像 W 那样占用空间。
我建议您测量您的String 值(如此处所述:How to calculate the string width in iText?)并将其与width 进行比较。使用我的额外代码 sn-p,您有一个 size 和一个 basefont。如果您的文本在变量text 中,这就是您获取文本宽度的方式:
float w = basefont.getWidthPoint(text, size);
如果该值大于width,则需要缩小字体size 以使文本适合。
重要提示:在某些形式中,字体大小定义为0。这并不意味着应该使用 0 的字体大小。这意味着查看者应该选择适合文本字段的字体大小。
更新:
在评论中你说:
例如,我的文本值的长度为 100 个字符,如果假设限制为 60。然后基于 60,我需要在 pdf 表单的第一页添加 60 个字符,在下一页添加 40 个字符的文本。 * 这里我想知道我们如何确定限制。
请比较:
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
与:
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
在这两种情况下,我们正好有 100 个字符。但是,第一个序列适合 StackOverflow 页面中的一行,而第二个序列不适合。
如果您的表单没有定义任何/MaxLength,那么您必须确定String 的字符是否与可用宽度匹配。 这不能表示为多个字符,因为适合的字符数取决于您要添加的字符!
100 个 I 字符可能适合,而 100 个 W 字符可能不适合。这是基本逻辑。你不同意我的观点让我很惊讶。
如果表单告诉您内容是使用等宽字体添加的,您只能计算适合多少字符。