2

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

4

0 回答 0