代码之家  ›  专栏  ›  技术社区  ›  cosinepenguin

abcpdf eform无线字段-值选项包含特殊字符

  •  1
  • cosinepenguin  · 技术社区  · 6 年前

    我试图用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."
    

    它可能是字段对象的选项对象中使用了非Unicode字符,也可能是非转义字符。 " ,结果是 � 但奇怪的是,这会妨碍检查正确的单选按钮,因为我无论如何都会给它传递一个索引。

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

    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 回复  |  直到 6 年前
        1
  •  0
  •   cosinepenguin    6 年前

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

    为此,如果不与选项对象的字符串交互,就无法选择单选按钮,而且由于字符串格式不正确,因此正常的选项选择代码不起作用。

    为了解决这个问题,如果有人发现自己在我的鞋子里,websupergo团队提供了以下功能:

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

    这个方法很有效,我希望将来能帮助别人!