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

时间:2018-07-02 16:39:03

标签: c# .net abcpdf

我正在尝试使用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字符,或者是出现了"的未转义的,但似乎很奇怪干扰检查右单选按钮,因为无论如何我都将其传递给索引。

我尝试通过执行以下操作在代码中“重命名” Option值:

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是否可以设置单选按钮,其中包含带有“特殊字符”的值,或者可以自行更改这些选项值?

1 个答案:

答案 0 :(得分:0)

我联系了WebSupergoo团队,他们非常有帮助。他们解释说,没有办法通过某种索引来选择单选按钮,并且每个选项所引用的字符串都必须与form选项中的字符串匹配。

为此,在不与Option对象的字符串交互的情况下,无法选择单选按钮,并且由于字符串格式错误,因此正常的选项选择代码无法正常工作。

作为一种变通方法,万一其他人发现我的鞋子,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();
}

会检查“选项”字段的字符串是否存在格式问题,并返回经过清理的选项列表。因此,以问题中的代码为例,通过执行以下操作,我将能够正确选择选项单选按钮:

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"));

此方法效果很好,希望以后能对其他人有所帮助!

相关问题