2012-05-18 2 views
3

У меня есть заполненный PDF-файл, содержащий CheckBoxes и RadioButtons и TextBox.Чтение флажка, название радиоканала и значения из PDF с помощью iText Sharp

Как получить имя CheckBox и его значение также, как мы знаем, что это флажок/Radio Button?

я использую 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 
      } 
     } 

ответ

4

Следующий код может помочь вам, если вам все еще нужно. Он работает только для 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)); 
} 

Edit:

Кроме того, field.Key это имя поля и field.Value это значение на него.

Для флажков, если (field.Value == «Да»), то он выбран ... если это что-то еще, оно не выбрано.

Edit:

И я только что узнал, как тро прибудет Radio Button вариантов, если вы в них нуждаетесь.

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); 
+0

спасибо, дайте мне попробовать ... –

+0

это сработало для вас? – Mike

+0

sry .. нужно chk on ... yo знаю, что это было опубликовано месяц назад ... m busy wid sm другая работа ... уверен, что я подтвержу лет как можно раньше ...спасибо за удругу приятель :) –

3

Радио кнопка, флажок и все кнопки на самом деле тот же тип поля, но с разными флагами. Вы можете увидеть флаги в разделе PDF Spec 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 
} 

Ниже приводится полным работают C# WinForm 2011 приложения ориентации iTextSharp 5.2.0, который показывает все вышеперечисленное глядя на файл под название 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(); 
     } 
    } 
} 
0

C# с System.Linq включены для радио-кнопок, получить какой вариант выбран из всех вариантов в виде радио, печать также все варианты выбора по их указанному имени в 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 + " "); 
} 
} 
}