首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iTextSharp。如何从AcroFields中获取特定类型?如PushButtonField、RadioCheckField等

iTextSharp。如何从AcroFields中获取特定类型?如PushButtonField、RadioCheckField等
EN

Stack Overflow用户
提问于 2015-10-20 18:02:07
回答 3查看 3.8K关注 0票数 2

我正在尝试将AcroFields转换为特定类型,以便在它们上设置属性。

当我调用AcroFields.GetField(string name);时,我得到的只是一个字符串。

当我调用AcroFields.GetFieldItem(string name);时,我会得到一个对象,但不能将它转换为特定的类型。

我也尝试过:

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

每次都是假的。

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

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

里面有个复选框。我想这样修改"CheckType“:myRadioCheckField.CheckType = RadioCheckField.TYPE_STAR

但是,由于不能将AcroField转换为特定类型,所以无法访问该属性"CheckType“。

有办法做到这一点吗?

如果可能的话,请提供一个工作样本。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-22 15:44:41

这是做不到的。

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

为了实现这一点,您必须编写自己的代码来解析和检查PDF。

票数 0
EN

Stack Overflow用户

发布于 2015-10-20 18:48:42

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

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

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

这将在FormInformation示例中解释,该示例是我书的第六章的一部分。

代码语言:javascript
复制
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上执行它,就会得到info.txt

到目前为止还不错,但接下来是一个难题:

怎样才能找到支票类型?我该怎么改呢?

这个问题暴露了对PDF的缺乏理解。当我们在前面的答案中查找复选框(或单选按钮)的可能值时,我们询问不同的外观状态。这些外观状态是用PDF语法表示的小部分内容。

例如:查看buttons.pdf表单。

当我们从外面看它时,我们看到:

"English“旁边的复选框可以是空方块,也可以是带粉红色背景和十字的正方形。现在让我们来看看里面:

我们看到这是表复选框,我们看到有两种外观状态:/Yes/Off。当选择这些状态时,会在流中描述这些状态是什么样子的。

/Off状态的流非常简单:

您会立即看到,我们正在构造一个矩形(re),并在不填充它的情况下绘制它(S)。

/Yes状态稍微复杂一些:

我们看到填充颜色正在被更改(rg),我们用黑色笔划矩形并使用定义的填充颜色(B)填充它。然后,我们用moveTo (m)和lineTo (l)操作定义了两行代码,并绘制了它们(S)。

如果你精通PDF语法,很容易看出我们在一个彩色矩形内画一个十字。所以如果你精通PDF就能回答你的问题.

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

概述:在PDF引用(ISO-32000-1)中没有像TYPE_STAR这样的东西,在任何PDF中也没有。如果您有现有的PDF,则无法将复选框或单选按钮投给RadioCheckField。您可以尝试重新构造RadioCheckField对象,但是如果您想知道复选框是否使用复选标记(星号)可视化,则.然后,您必须解释PDF语法。如果您不想这样做,您就不能创建“原始”的RadioCheckField对象,该对象用于创建PDF,因为在PDF中缺少现成的可用信息。

票数 7
EN

Stack Overflow用户

发布于 2015-10-22 15:39:15

经过一些研究,我得出的结论是,在当前版本的iTextSharp 5.5.7.0中,此时:

不可能获取一个AcroField并将其转换回最初用于生成字段的原始类( RadioCheckField ).

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33243667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档