使用iTextSharp读取复选框,单选按钮名称和PDF值

时间:2012-05-18 11:19:31

标签: c#-4.0 pdf annotations itextsharp acrofields

我有一个可填写的PDF包含CheckBoxes和RadioButtons以及TextBox。

如何获取CheckBox名称及其值,我们如何知道它是一个复选框/单选按钮?

我正在使用iTextSharp并查看我的以下代码

 PdfReader pdfReader = new PdfReader(FileName);
 pdfReader.SelectPages("37");
        MemoryStream oStream = new MemoryStream();
        PdfStamper stamper = new PdfStamper(pdfReader, oStream);
        AcroFields form = stamper.AcroFields;
        if (form.Fields.Count() > 0)
        {
            IDictionary<string,AcroFields.Item> oDic= form.Fields;

            foreach (string FieldName in oDic.Keys)
            {
                //FieldName - CheckBox name; i need to confirm that is a Checkbox...
            }

            foreach (AcroFields.Item oItem in oDic.Values)
            {
                // how do we get check box values
            }
        }

3 个答案:

答案 0 :(得分:5)

如果您仍然需要,以下代码可能会帮助您。它只适用于AcroForms

int BUTTON = 1;
int CHECK_BOX = 2;
int RADIO_BUTTON = 3;
int TEXT_FIELD = 4;
int LIST_BOX = 5;
int COMBO_BOX = 6;

PdfReader pdfReader = new PdfReader(path);
AcroFields af = pdfReader.AcroFields;

foreach (var field in af.Fields)
{
    bool isRadio = RADIO_BUTTON == af.GetFieldType(field.Key));
}

编辑:

另外,field.Key是字段和字段的名称.Value是它的值。

对于复选框,if(field.Value ==“Yes”)然后选中它......如果是其他任何内容,则不会选中它。

编辑:

如果你需要的话,我刚刚发现了如何使用单选按钮选项。

myKey k = new myKey(field.Key, af.GetField(field.Key), af.GetFieldType(field.Key));
if (k.isRadio())
{
    try { k.options.AddRange(af.GetAppearanceStates(k.key)); }
    catch { }
}
Keys.Add(k);

答案 1 :(得分:4)

单选按钮,复选框和按钮实际上都是相同类型的字段,但设置了不同的标记。您可以在PDF规范部分12.7.4.2.1表226中看到标记。

int ffRadio = 1 << 15;      //Per spec, 16th bit is radio button
int ffPushbutton = 1 << 16; //17th bit is push button

对于给定的Field,您希望获得与其关联的Widget。通常这只是一个,但可以更多,所以你应该考虑到这一点。

PdfDictionary w = f.Value.GetWidget(0);

按钮字段的字段类型(/Ft)设置为/Btn,因此请检查

if (!w.Contains(PdfName.FT) || !w.Get(PdfName.FT).Equals(PdfName.BTN)) {continue;/*Skipping non-buttons*/ }

对于当前Widget获取可选字段标志(/Ff)值,如果不存在则使用零。

int ff = (w.Contains(PdfName.FF) ? w.GetAsNumber(PdfName.FF).IntValue : 0);

然后只是一些简单的数学:

if ((ff & ffRadio) == ffRadio) {
    //Is Radio
} else if (((ff & ffRadio) != ffRadio) && ((ff & ffPushbutton) != ffPushbutton)) {
    //Is Checkbox
} else {
    //Regular button
}

以下是针对iTextSharp 5.2.0的全功能C#WinForm 2011应用,它展示了上述所有内容,查看了桌面上名为Test.pdf的文件。只需在条件中添加一些逻辑来处理每个按钮类型。

using System;
using System.IO;
using System.Windows.Forms;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication3 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
            PdfReader reader = new PdfReader(testFile);
            var fields = reader.AcroFields;

            int ffRadio = 1 << 15;      //Per spec, 16th bit is radio button
            int ffPushbutton = 1 << 16; //17th bit is push button
            int ff;
            //Loop through each field
            foreach (var f in fields.Fields) {
                //Get the widgets for the field (note, this could return more than 1, this should be checked)
                PdfDictionary w = f.Value.GetWidget(0);
                //See if it is a button-like object (/Ft == /Btn)
                if (!w.Contains(PdfName.FT) || !w.Get(PdfName.FT).Equals(PdfName.BTN)) { continue;/*Skipping non-buttons*/ }
                //Get the optional field flags, if they don't exist then just use zero
                ff = (w.Contains(PdfName.FF) ? w.GetAsNumber(PdfName.FF).IntValue : 0);
                if ((ff & ffRadio) == ffRadio) {
                    //Is Radio
                } else if (((ff & ffRadio) != ffRadio) && ((ff & ffPushbutton) != ffPushbutton)) {
                    //Is Checkbox
                } else {
                    //Regular button
                }
            }
            this.Close();
        }
    }
}

答案 2 :(得分:0)

包含System.Linq的C# 对于单选按钮,从无线电形式的所有选项中选择哪个选项,在Adobe Acrobat Pro中按指定名称打印所有选项

  AcroFields fields = reader.AcroFields;
 List<string> fldNames = new List<string>(fields.Fields.Keys);
            if (fldNames.Count > 0) //am gasit cel putin un acroform
            {
                foreach (string fldname in fldNames)
                {
                    int tip = fields.GetFieldType(fldname);
if (tip == 3) //choice  / radio
                    {
                        Console.WriteLine("radio form");
                        string[] valori = fields.GetListSelection(fldname);
                        foreach (string s in valori)
                            Console.WriteLine(s + " ");
                        Console.WriteLine("selected from radio form options");
                        string[] valori2 = fields.GetAppearanceStates(fldname);
                        //Console.WriteLine(valori2.Length);
                        var val2 = (from string c in valori2
                                   where (c.ToLower().CompareTo("off") != 0)
                                   select c).ToList();
                        if (val2.Count > 0)
                            foreach (string s2 in val2)
                                Console.WriteLine(s2 + " ");
}
}
}