将Acrofield移动到其他页面

时间:2014-04-14 08:06:41

标签: c# pdf itextsharp acrofields

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拆分到不同的页面上,如上所示。

0 个答案:

没有答案