iTextSharp的。如何从AcroFields获取特定类型?像PushButtonField,RadioCheckField等

问题描述 投票:1回答:3

我试图将AcroFields强制转换为特定类型,以便我可以设置它们的属性。

当我打电话给AcroFields.GetField(string name);时,我得到的只是一个字符串。

当我调用AcroFields.GetFieldItem(string name);时,我得到一个对象,但无法将其转换为特定类型。

我也尝试过:

AcroFields.SetFieldProperty("myfield", "CheckType", RadioCheckField.TYPE_STAR, null);

每次都返回false。

为了更好地解释我的场景:

我有一个现有的PDF(我没有生成这个文件)。

其中有一个复选框。我想像这样更改“CheckType”:myRadioCheckField.CheckType = RadioCheckField.TYPE_STAR

但由于我无法将AcroField强制转换为特定类型,因此我无法访问该属性“CheckType”。

有没有办法实现这个目标?

如果可能,请提供工作样本。

谢谢。

c# pdf-generation itextsharp
3个回答
0
投票

这是不可能做到的。

据我所知,iTextSharp不支持从AcroField转换回用于生成字段的原始类(RadioCheckField)。

您必须编写自己的代码来解析并检查PDF以实现此目的。


4
投票

您的帖子包含两个不同的问题。一个问题很容易回答。另一个问题是无法回答的。

让我们从简单的问题开始:

如何从AcroFields获取特定类型?像PushButtonField,RadioCheckField等

这在FormInformation示例中进行了解释,该示例是chapter 6 of my book的一部分:

PdfReader reader = new PdfReader(datasheet);
// Get the fields from the reader (read-only!!!)
AcroFields form = reader.AcroFields;
// Loop over the fields and get info about them 
StringBuilder sb = new StringBuilder();       
foreach (string key in form.Fields.Keys) {
    sb.Append(key);
    sb.Append(": ");
    switch (form.GetFieldType(key)) {
        case AcroFields.FIELD_TYPE_CHECKBOX:
            sb.Append("Checkbox");
            break;
        case AcroFields.FIELD_TYPE_COMBO:
            sb.Append("Combobox");
            break;
        case AcroFields.FIELD_TYPE_LIST:
            sb.Append("List");
            break;
        case AcroFields.FIELD_TYPE_NONE:
            sb.Append("None");
            break;
        case AcroFields.FIELD_TYPE_PUSHBUTTON:
            sb.Append("Pushbutton");
            break;
        case AcroFields.FIELD_TYPE_RADIOBUTTON:
            sb.Append("Radiobutton");
            break;
        case AcroFields.FIELD_TYPE_SIGNATURE:
            sb.Append("Signature");
            break;
        case AcroFields.FIELD_TYPE_TEXT:
            sb.Append("Text");
            break;
        default:
            sb.Append("?");
            break;
    }
    sb.Append(Environment.NewLine);
} 
// Get possible values for field "CP_1"
sb.Append("Possible values for CP_1:");
sb.Append(Environment.NewLine);
string[] states = form.GetAppearanceStates("CP_1");
for (int i = 0; i < states.Length; i++) {
    sb.Append(" - ");
    sb.Append(states[i]);
    sb.Append(Environment.NewLine);
}
// Get possible values for field "category"
sb.Append("Possible values for category:");
sb.Append(Environment.NewLine);
states = form.GetAppearanceStates("category");
for (int i = 0; i < states.Length - 1; i++) {
    sb.Append(states[i]);
    sb.Append(", ");
}
sb.Append(states[states.Length - 1]);

此代码段存储StringBuilder中字段的类型,以及无线电字段和复选框的可能值。

如果你在datasheet.pdf上执行它,你会得到form_info.txt

到目前为止一直很好,但接下来是一个棘手的问题:

我如何找到支票类型?我该如何改变它?

这个问题表明对PDF缺乏了解。当我们在上一个答案中查找复选框(或单选按钮)的可能值时,我们询问了不同的外观状态。这些外观状态是以PDF语法表示的小块内容。

例如:看看buttons.pdf表格。

当我们在外面看时,我们看到:

enter image description here

“英语”旁边的复选框可以是空白正方形或带有粉红色背景和十字形的正方形。现在让我们来看看内部:

enter image description here

我们看到这是表复选框,我们看到有两种外观状态:/Yes/Off。选择后这些状态的内容将在流中描述。

/Off州的流非常简单:

enter image description here

你立即看到我们正在构建一个矩形(re)并绘制它而不填充它(S)。

/Yes州稍微复杂一些:

enter image description here

我们看到填充颜色正在改变(rg),我们用黑色描边矩形并使用定义的填充颜色(B)填充它。然后我们用moveTo(m)和lineTo(l)操作定义两条线,然后我们描边(S)。

如果您精通PDF语法,很容易看到我们在彩色矩形内绘制一个十字。所以,如果您精通PDF,那就回答您的问题......

如果要替换外观,则必须替换绘制矩形和十字的流。这并非不可能,但这与你发布的问题不同。

总结:PDF参考(ISO-32000-1)中没有TYPE_STAR,也没有任何PDF。如果您有现有PDF,则无法将复选框或单选按钮强制转换为RadioCheckField。您可以尝试重建RadioCheckField对象,但是如果您想知道是否使用复选标记,星形图标来显示复选框,那么您必须解释PDF语法。如果您不想这样做,则由于PDF中缺少现成的信息,您无法创建用于创建PDF的“原始”RadioCheckField对象。


1
投票

经过一些研究后,我得出的结论是,目前版本的iTextSharp v5.5.7.0:

无法获取AcroField并将其强制转换回用于首先生成字段的原始类(RadioCheckField)。

因此,像PushButtonField和RadioCheckField这样的特定类仅对生成新PDF有用,但不适用于编辑现有PDF。

© www.soinside.com 2019 - 2024. All rights reserved.