与iTextSharp - move Acrofield相似,但没有声望我不能在那里写评论。
如何将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);
在不同的尝试中使用旧值的值创建新的radiofield:
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页上添加所有的RadioFields,而不是在项目本身应放置的页面上。
如果你想知道我的任务的目的: 在我们的大多数PDF上,我们在不同的页面上有几个性别无线电。它们都具有相同的字段名称(“性别”)并且应该一致地执行 - 因此当您在一个页面上选择“男性”时,也会在所有其他页面上选择“男性”选项。 使用InDesign生成交互式PDF后,无线电按钮没有标记为unison-flag,如下所示:
http://i.stack.imgur.com/3NTaN.jpg
当我们在Acrobat中手动打勾时,一切正常,但文档很多并经常重新创建,所以我们必须通过代码来完成。
尝试通过以下示例实验的代码修改unison-behavior:
pdfstamper.AcroFields.SetFieldProperty("gender", "setfflags", PdfFormField.FF_RADIOSINUNISON, null);
令人惊讶的是,“同名和选择的按钮同时被选中” - 现在在检查Acrobat中的单选按钮属性时选中复选框,但它仍然不会同时执行。
在所有目标页面上放置具有相同字段名称(“性别”)的多个RadioGroup(在“AddAnnotation”-Method中设置pagenumber),它们显示在正确的位置,但不是一致行动(例如,选择尽管在“GetRadioGroup”-Method中设置了“radiosInUnison” - 参数,但第2页上的“男性”取消了第1页的无线电
将所有radioFields添加到一个radioGroup时,行为与预期一致,但我们无法将radioFields拆分到不同的页面上,如上所示。