Радио кнопка, флажок и все кнопки на самом деле тот же тип поля, но с разными флагами. Вы можете увидеть флаги в разделе 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();
}
}
}
спасибо, дайте мне попробовать ... –
это сработало для вас? – Mike
sry .. нужно chk on ... yo знаю, что это было опубликовано месяц назад ... m busy wid sm другая работа ... уверен, что я подтвержу лет как можно раньше ...спасибо за удругу приятель :) –