【问题标题】:How do you find out if PDF Textbox field is multi-line using ABCpdf?您如何使用 ABCpdf 确定 PDF 文本框字段是否为多行?
【发布时间】:2014-01-27 19:25:01
【问题描述】:

我可以使用 ABCpdf 使用 GetFieldNames() 集合遍历 PDF 中的所有字段并获取它们的属性,但我似乎无法获得的是该字段是否为多行文本字段。有没有关于如何找到这个属性的例子?如果有帮助,我的代码如下,但可能没有必要。

    ....

    foreach (string fieldName in doc.Form.GetFieldNames())
    {
        WebSupergoo.ABCpdf9.Objects.Field f = doc.Form[fieldName];
        dt = GetFieldInstances(dt,f);
    }

    ....

    private static DocumentTemplate GetFieldInstances(DocumentTemplate dt, WebSupergoo.ABCpdf9.Objects.Field f)
    {
        Field field;
        Instance inst = new Instance(); 
        int instanceCount = 0;
        bool fieldAlreadyExists = dt.Fields.Any(currentField => currentField.Name == f.Name);
        if (!fieldAlreadyExists)
        {
            field = new Field();
            field.Name = f.Name;
            field.Value = f.Value;
            field.Format = f.Format == null ? null : f.Format;
            field.PartialName = f.PartialName;
            field.TypeID = (int)f.FieldType;

            //field.IsMultiline = 
            //field.IsRequired = 
        }
        else
        {
            field = (from currentField in dt.Fields where currentField.Name == f.Name select currentField).SingleOrDefault();
            instanceCount = field.Instances.Count();
        }

        if ((Field.FieldTypes)f.FieldType == Field.FieldTypes.Radio || (Field.FieldTypes)f.FieldType == Field.FieldTypes.Checkbox)
        {
            inst.ExportValue = f.Options[instanceCount];
        }
        if (f.Kids.Count() > 0)
        {
            f = f.Kids[instanceCount];
        }
        inst.Bottom = (int)f.Rect.Bottom;
        inst.Height = (int)f.Rect.Height;
        inst.Left = (int)f.Rect.Left;
        inst.Width = (int)f.Rect.Width;
        inst.PageNumber = f.Page.PageNumber;




        field.Instances.Add(inst);

        if (!fieldAlreadyExists)
        {
            dt.Fields.Add(field);
        }
        return dt;
    }

【问题讨论】:

    标签: c# pdf abcpdf


    【解决方案1】:

    我想通了:

    public bool GetIsMultiLine(WebSupergoo.ABCpdf9.Objects.Field field)
    {
        var flags = Atom.GetInt(Atom.GetItem(field.Atom, "Ff"));
        var isMultiLine = GetIsBitFlagSet(flags, 13);
        return isMultiLine;
    }
    
    public bool GetIsRequired(WebSupergoo.ABCpdf9.Objects.Field field)
    {
        var flags = Atom.GetInt(Atom.GetItem(field.Atom, "Ff"));
        var isRequired = GetIsBitFlagSet(flags, 2);
        return isRequired;
    }
    
    public bool GetIsReadOnly(WebSupergoo.ABCpdf9.Objects.Field field)
    {
        var flags = Atom.GetInt(Atom.GetItem(field.Atom, "Ff"));
        var isReadOnly = GetIsBitFlagSet(flags, 1);
        return isReadOnly;
    }
    
    private static bool GetIsBitFlagSet(int b, int pos)
    {
        return (b & (1 << (pos - 1))) != 0;
    }
    

    如果您不熟悉无符号整数/二进制转换,I found this site really helpful to understand.

    例如,假设为字段标志返回的整数等于 4096。如果您将其输入到该网站的 online coversion tool,它将显示第 13 位位置已打开(1 而不是 0从右边开始的第 13 个位置)。

    在 ABCPdf 指南中,它说 Multi-Line 是位位置 13,因此您知道该字段是 Multi-Line 字段。

    对于必填项的第二个位置和只读的第一个位置也是如此。

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 2010-10-30
      • 1970-01-01
      • 2020-04-17
      • 2021-09-08
      • 1970-01-01
      • 2014-01-05
      • 2011-02-07
      • 2019-01-22
      相关资源
      最近更新 更多