Радио-поля abcPDF eForm - значения параметров содержат специальные символы - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь использовать 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."

Похоже, что не-юникодный символ используется в объекте Option объекта Field, или, возможно, не экранированный ", что приводит к , но кажется странным, что это будет мешать проверке переключатель справа, так как я все равно передаю ему индекс.

Я попытался «переименовать» значения 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 голосов
/ 05 июля 2018

Я обратился к команде WebSupergoo, и они были чрезвычайно полезны. Они объяснили, что не существует способа выбора переключателей по какому-либо индексу, и что строки, на которые ссылается каждый параметр, должны соответствовать строке в параметре формы.

С этой целью невозможно выбрать переключатель без взаимодействия со строкой объекта 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"));

Этот метод отлично работает, и я надеюсь, что он может помочь кому-то еще в будущем!

...