我已经研究过这个问题,我尝试了以下代码片段。不幸的是,我无法找到AcroForm表单中文本字段的最大字符数限制:
Snippet 1
List<AcroFields.FieldPosition> positions = fields.getFieldPositions(signame);
Rectangle rect = positions.get(0).position; // In points:
float left = rect.getLeft();
float bTop = rect.getTop();
float width = rect.getWidth();
float height = rect.getHeight();
Snippet 2
PdfDictionary mergedFieldDictionary = myAcroFields.getFieldItem( key ).getMerged( 0 );
PdfNumber maxLengthNumber = mergedFieldDictionary.getAsNumber( PdfName.MAXLEN );
if (maxLenghtNumber != null) {
MaxFieldLength = maxLengthNumber.intValue();
}
任何人都可以帮帮我吗?
答案 0 :(得分:0)
代码段2是正确的(在我应用了一个小修复之后),但只有在为表单字段定义了最大长度时它才有效。通常,不会定义最大长度,maxLenghtNumber
将为null
。
如果没有定义最大长度,则没有限制,因此如果文本适合,则必须测量。根据您的代码段1,您已经知道可用的宽度:width
。这个宽度可以容纳多少个字符取决于字体大小和字符。字符的宽度取决于字体。
这是一个额外的代码段:
TextField tx = new TextField(writer, null, null);
fields.decodeGenericDictionary(mergedFieldDictionary, tx);
float size = tx.getFontSize();
BaseFont basefont = tx.getFont();
如果字体是等宽字体,则很容易知道宽度内适合的字符数。在这种情况下,它足以获得单个字形的宽度(例如w
)并将总宽度除以字形宽度:width / w
。
通常,字体会有比例宽度,使您的问题无法回答。例如:&#34; IIIIIIIIII&#34; 的宽度小于&#34; WWWWWWWWWW&#34; 的宽度在这两种情况下,我们有10个字符,但是我没有像 W 那样占用空间。
我建议您衡量一下String
值(如此处所述:How to calculate the string width in iText?)并将其与width
进行比较。使用我的额外代码段,您有size
和basefont
。如果您的文本位于变量text
中,则可以获得文本的宽度:
float w = basefont.getWidthPoint(text, size);
如果该值大于width
,则需要缩小字体size
的大小以使文本适合。
重要提示:在某些形式中,字体大小定义为0
。这并不意味着应该使用0的字体大小。这意味着观众应该以适合文本字段的方式选择字体大小。
<强>更新强>
在评论中你说:
例如,我的文本值长度为100个字符,如果假设限制为60.那么基于60,我需要在第一页中添加60个字符,在pdf格式的下一页中添加剩余的40个字符文本。 *我想知道如何确定限制。
请比较:
<强> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 强>
使用:
<强> WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 强>
在这两种情况下,我们都有100个字符。但是,第一个序列适合StackOverflow页面中的一行,而第二个序列不适合。
如果您的表单没有定义任何/MaxLength
,那么您必须确定String
的字符是否与可用宽度相匹配。 这不能表示为多个字符,因为符合的字符数取决于您要添加的字符!
100 I 字符可能适合,而100 W 字符可能不适合。这是基本逻辑。令我惊讶的是你不同意我的看法。
如果表单告诉您使用等宽字体添加内容,则只能计算适合的字符数。