【问题标题】:Find maximum character limit of AcroField text box in PDF using itext api?使用 itext api 查找 PDF 中 AcroField 文本框的最大字符数限制?
【发布时间】:2015-08-05 16:54:50
【问题描述】:

我研究过这个问题并尝试了以下代码sn-ps。不幸的是,我找不到 AcroForm 表单中文本字段的最大字符数限制:

片段 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();

片段 2

PdfDictionary mergedFieldDictionary = myAcroFields.getFieldItem( key ).getMerged( 0 );
PdfNumber maxLengthNumber = mergedFieldDictionary.getAsNumber( PdfName.MAXLEN );
if (maxLenghtNumber != null) {
  MaxFieldLength = maxLengthNumber.intValue();
} 

谁能帮帮我?

【问题讨论】:

    标签: java android pdf itext


    【解决方案1】:

    代码 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 字符可能不适合。这是基本逻辑。你不同意我的观点让我很惊讶。

    如果表单告诉您内容是使用等宽字体添加的,您只能计算适合多少字符。

    【讨论】:

    • 实际上,我的要求是在填充formFiled中的文本之前知道最大字符限制。在这里,我们需要考虑 PDF 表单附带的基本字体,我也不想更改字体大小。 需要计算适合表单域的最大字符数。
    • 请运用你的常识,问问自己你的问题是否有道理。如果字符没有可预测的宽度,您如何计算适合表单字段的最大字符?请确认您理解您的问题没有意义。
    • * 例如,我的文本值为 100 个字符,如果假设限制为 60。然后基于 60,我需要在第一页添加 60 个字符,在下一页添加剩余 40 个字符的文本pdf 表格的页面。 * 这里我想知道我们如何确定限制。
    • 我会更新我的问题,希望你能看到你想法中的错误。
    • 更新完成。我希望你现在同意我的观点,你的问题是错误的。如果您不同意,则不应期待答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多