类似于iTextSharp - 移动 Acrofield但没有 Reputation 我不能在那里写评论。
RadioButtonItem 如何移动到不同的页面?我尝试了几件事,包括使用内部方法“ForcePage”、属性“PlaceInPage”或将 PdfName.P 设置为新页面但没有成功:
PdfReader pdfr = new PdfReader(docdata);
var mspdf = new MemoryStream();
var pdfstamper = new PdfStamper(pdfr, mspdf);
var _field = pdfstamper.AcroFields.GetFieldItem("gender");
//accessing the internal "ForcePage" Method
System.Reflection.BindingFlags bindingFlags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
System.Reflection.MethodInfo minfo = _field.GetType().GetMethod("ForcePage", bindingFlags);
minfo.Invoke(_field, new Object[] { 0, 2 });
//trying to set it manually
_field.GetWidget(0).Put(PdfName.P, (PdfObject)pdfstamper.Writer.GetPageReference(2));
这不会以任何方式影响生成的 PDF 中的字段位置,而取自另一个 SO-Question 的示例非常适合在当前页面内移动 radioField:
PdfArray rect = _field.GetWidget(0).GetAsArray(PdfName.RECT);
rect[0] = new PdfNumber(20);
在不同的尝试中使用旧的值创建一个新的无线电场:
PdfFormField radiogroup = null;
for (int i = 0; i < _field.Size ; i++)
{
object onValue = _field.GetWidget(i).GetAsDict(PdfName.AP).GetAsDict(PdfName.N).Keys.First();
RadioCheckField radio = new RadioCheckField(pdfstamper.Writer, pdfstamper.AcroFields.GetFieldPositions("gender")[i].position, "genderNew", PdfName.DecodeName(name.ToString()));
if (radiogroup == null)
{
radiogroup = radio.GetRadioGroup(true, true);
radiogroup.FieldName = "genderNew";
}
var radiofield = radio.RadioField;
page = pdfstamper.AcroFields.GetFieldPositions("gender")[i].page;
radiofield.Page = page;
((PdfAnnotation)radiofield).PlaceInPage = page;
radiogroup.AddKid(radiofield);
}
pdfstamper.AddAnnotation(radiogroup, 1);
pdfstamper.AcroFields.RemoveField("gender");
这会在第 1 页上添加所有 RadioField,而不是在应该放置项目本身的页面上。
如果您想知道我的任务的目的:在我们的大多数 PDF 中,我们在不同的页面上都有几个 Gender-Radio。它们都具有相同的字段名(“性别”)并且应该一致行动 - 因此,当您在一个页面上选择“男性”时,也会在所有其他页面上选择“男性”选项。使用 InDesign 生成交互式 PDF 后,单选按钮未使用 unison-flag 标记,如下所示:
http://i.stack.imgur.com/3NTaN.jpg
当我们在 Acrobat 中手动打勾时,一切正常,但是文档很多并且经常重新创建,因此我们必须通过代码来完成。
尝试通过代码修改一致行为,我尝试了以下示例:
pdfstamper.AcroFields.SetFieldProperty("gender", "setfflags", PdfFormField.FF_RADIOSINUNISON, null);
令人惊讶的是,“一致地选择了具有相同名称和选项的按钮” - 检查 Acrobat 中的单选按钮属性时,现在选中了复选框,但它仍然没有一致地行动。
在所有目标页面上放置几个具有相同字段名(“性别”)的 RadioGroup(在“AddAnnotation”方法中设置页码),它们会显示在正确的位置,但不会一致(例如选择“男性”尽管在“GetRadioGroup”-Method 中设置了“radiosInUnison”-Parameter,但在第 2 页上取消选择第 1 页上的无线电)
将所有 radioFields 添加到一个 radioGroup 时,行为与预期一致,但我们不能将 radioFields 拆分到不同的页面上,如上所示。