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"));
这个方法很管用,希望对以后的人有所帮助!
我正在尝试使用 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"));
这个方法很管用,希望对以后的人有所帮助!