abcPDF eForm 单选字段 - 值选项包含特殊字符

abcPDF eForm Radio Fields - Value Options Contain Special Characters

我正在尝试使用 abcPDF 填写表单字段,但在选择某些单选按钮时我 运行 遇到了问题。我正在处理的表单有几个单选按钮字段,其中大部分我可以通过以下方式设置:

Doc theDoc = new Doc();
theDoc.Read(Server.MapPath("fileName.pdf"));
Field areYouHappy = theDoc.Form["Q28_happy"];
areYouHappy.Value = areYouHappy.Options[0]; // set Field areYouHappy to Option 0 (yes)
theDoc.Save(Server.MapPath("newFileName.pdf"));

这对大多数按钮都适用,但有些按钮没有正确设置(或者根本没有)。功能按钮和故障按钮之间的唯一区别是字段的选项帮助文本或名称。

例如,在调试器中查看损坏的字段时,有以下选项:

Options[0] "If your answer is �Yes,� select this option."
Options[1] "If your answer is �No,� select this option."

对比功能字段:

Options[0] "If you're happy and you know it, select this option."
Options[1] "Clap your hands, select this option."

似乎在 Field 对象的 Option 对象中使用了非 unicode 字符,或者可能是非转义的 ",导致 ,但这似乎很奇怪会干扰检查正确的单选按钮,因为无论如何我都会给它传递一个索引。

我已经通过执行以下操作 "renaming" 在代码中尝试了选项值:

Field areYouHappy = theDoc.Form["Q28_happy"];
areYouHappy.Options[0] = areYouHappy.Options[0].RemoveSymbols();
areYouHappy.Options[1] = areYouHappy.Options[1].RemoveSymbols();
areYouHappy.Value = areYouHappy.Options[0];

但这不起作用,尽管调试器显示 RemoveSymbols 正在执行它的工作:

Options[0] "IfyouranswerisYesselectthisoption."
Options[1] "IfyouranswerisNoselectthisoption."

abcPDF 是否有办法设置单选按钮的值带有 'special characters',或者有办法自己更改这些选项值吗?

我联系了 WebSupergoo 团队,他们提供了极大的帮助。他们解释说没有办法通过某种索引 select 单选按钮,并且每个选项引用的字符串必须与表单选项中的字符串相匹配。

为此,如果不与 Option 对象的字符串交互,就无法 select 单选按钮,并且由于字符串格式错误,正常的选项 select 代码无法正常工作。

作为变通方法,以防其他人遇到我的情况,WebSupergoo 团队提供了这个功能:

/// <summary>
/// Checks each field to ensure it has properly formatted options
/// </summary>
/// <param name="field"></param>
/// <returns>An array of options that have been safely formatted</returns>
private static string[] VetField(Field field)
{
    List<string> options = new List<string>();
    foreach (Field kid in field.Kids)
    {
        bool different = false;
        DictAtom ap1 = kid.Resolve(Atom.GetItem(kid.Atom, "AP")) as DictAtom;
        if (ap1 == null) continue;
        DictAtom ap2 = new DictAtom();
        foreach (var pair1 in ap1)
        {
            DictAtom apType1 = kid.Resolve(pair1.Value) as DictAtom;
            Debug.Assert(apType1 != null); // should never happen
            DictAtom apType2 = new DictAtom();
            ap2[pair1.Key] = apType2;
            foreach (var pair2 in apType1)
            {
                string name1 = pair2.Key;
                StringBuilder sb = new StringBuilder();
                foreach (char c in name1)
                {
                    if (c < 128)
                        sb.Append(c);
                }
                string name2 = sb.ToString();
                if (name1 != name2)
                    different = true;
                apType2[name2] = pair2.Value;
                if (pair1.Key == "N")
                    options.Add(name2);
            }
        }
        if (different)
                ((DictAtom)kid.Atom)["AP"] = ap2;
    }
    return options.ToArray();
}

它检查选项字段的字符串是否存在格式问题,returns 一个清理过的选项列表。因此,以问题中的代码为例,我可以通过执行以下操作正确 select 选项单选按钮:

Doc theDoc = new Doc();
theDoc.Read(Server.MapPath("fileName.pdf"));

Field areYouHappy = theDoc.Form["Q28_happy"];
string[] options = VetField(areYouHappy); //uses above function to check for formatting errors

areYouHappy.Value = options[0];
theDoc.Save(Server.MapPath("newFileName.pdf"));

这个方法很管用,希望对以后的人有所帮助!