使用 Itext 检索 Pdf 表单字段位置
Pdf form fields position retrieval with Itext
使用 iTextSharp,我可以检索 PDF 中存在的所有表单字段 form.I 我正在使用 Adobe acrobat reader 编辑 PDF,我看到,每个字段都有一个位置表示 PDF 字段在表单中的位置的属性。
所以我的问题是,我可以读取那个值吗?
比如我在PDF表单中有一个表单域Name,我可以获取这个域的位置值,比如左0.5英寸,右2.5英寸,上2英寸,下2英寸吗?
现在我正在使用以下代码检索表单字段:
string pdfTemplate = @"D:\abc.pdf";
PdfReader reader = new PdfReader(pdfTemplate);
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)
{
String type = "";
String name = f.Key.ToString();
String value = fields.GetField(f.Key);
//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))
{
type = "T";
}
else
{
//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
type = "R";
}
else if (((ff & ffRadio) != ffRadio) && ((ff & ffPushbutton) != ffPushbutton))
{
//Is Checkbox
type = "C";
}
else
{
//Regular button
type = "B";
}
}
//MessageBox.Show(type + "=>" + name + "=>" + value);
FormFields fld = new FormFields(name, type, value, "inputfield" +form_fields.Count);
form_fields.Add(fld);
if (type.Equals("T"))
addContent(form_fields.Count);
}
我正要将这个问题作为 Find field absolute position and dimension by acrokey 的副本来结束,但这是一个 Java 的答案,虽然大多数开发人员在将 Java 转换为 C# 时没有问题,但它可能有助于一些开发人员获得 C# 答案。
PDF 中的字段使用小部件注释可视化。一个字段可以对应不同的注解。例如,您可以在每个页面上显示一个名为 name
的字段。在这种情况下,该字段的值将显示在每个页面上。
有一个 GetFieldPositions()
方法 returns 多个位置的列表,每个小部件注释一个。
这是我从问题iTextSharp GetFieldPositions to SetSimpleColumn
的答案中复制的一些代码
IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions("fieldNameInThePDF");
if (fieldPositions == null || fieldPositions.Count <= 0) throw new ApplicationException("Error locating field");
AcroFields.FieldPosition fieldPosition = fieldPositions[0];
left = fieldPosition.position.Left;
right = fieldPosition.position.Right;
top = fieldPosition.position.Top;
bottom = fieldPosition.position.Bottom;
如果一个字段对应一个小部件注释,则left
、right
、top
和bottom
将为您提供左、右、上和下场的坐标。字段的宽度可以这样计算:right - left
;这样的身高:top - bottom
。这些值以 用户单位 表示。默认情况下,一英寸有 72 个用户单位。
如果您的文档包含不止一页,那么 fieldPosition.page
将为您提供该字段所在的页码。
所有这些都记录在 http://developers.itextpdf.com/
使用 iTextSharp,我可以检索 PDF 中存在的所有表单字段 form.I 我正在使用 Adobe acrobat reader 编辑 PDF,我看到,每个字段都有一个位置表示 PDF 字段在表单中的位置的属性。
所以我的问题是,我可以读取那个值吗?
比如我在PDF表单中有一个表单域Name,我可以获取这个域的位置值,比如左0.5英寸,右2.5英寸,上2英寸,下2英寸吗?
现在我正在使用以下代码检索表单字段:
string pdfTemplate = @"D:\abc.pdf";
PdfReader reader = new PdfReader(pdfTemplate);
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)
{
String type = "";
String name = f.Key.ToString();
String value = fields.GetField(f.Key);
//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))
{
type = "T";
}
else
{
//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
type = "R";
}
else if (((ff & ffRadio) != ffRadio) && ((ff & ffPushbutton) != ffPushbutton))
{
//Is Checkbox
type = "C";
}
else
{
//Regular button
type = "B";
}
}
//MessageBox.Show(type + "=>" + name + "=>" + value);
FormFields fld = new FormFields(name, type, value, "inputfield" +form_fields.Count);
form_fields.Add(fld);
if (type.Equals("T"))
addContent(form_fields.Count);
}
我正要将这个问题作为 Find field absolute position and dimension by acrokey 的副本来结束,但这是一个 Java 的答案,虽然大多数开发人员在将 Java 转换为 C# 时没有问题,但它可能有助于一些开发人员获得 C# 答案。
PDF 中的字段使用小部件注释可视化。一个字段可以对应不同的注解。例如,您可以在每个页面上显示一个名为 name
的字段。在这种情况下,该字段的值将显示在每个页面上。
有一个 GetFieldPositions()
方法 returns 多个位置的列表,每个小部件注释一个。
这是我从问题iTextSharp GetFieldPositions to SetSimpleColumn
的答案中复制的一些代码IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions("fieldNameInThePDF");
if (fieldPositions == null || fieldPositions.Count <= 0) throw new ApplicationException("Error locating field");
AcroFields.FieldPosition fieldPosition = fieldPositions[0];
left = fieldPosition.position.Left;
right = fieldPosition.position.Right;
top = fieldPosition.position.Top;
bottom = fieldPosition.position.Bottom;
如果一个字段对应一个小部件注释,则left
、right
、top
和bottom
将为您提供左、右、上和下场的坐标。字段的宽度可以这样计算:right - left
;这样的身高:top - bottom
。这些值以 用户单位 表示。默认情况下,一英寸有 72 个用户单位。
如果您的文档包含不止一页,那么 fieldPosition.page
将为您提供该字段所在的页码。
所有这些都记录在 http://developers.itextpdf.com/