iTextSharp SetField for fields with same name on different pages

天大地大妈咪最大 提交于 2019-12-12 04:56:14

问题


I used acroFields.GetTranslatedFieldName() to get the next fieldnames from the pdf:

topmostSubform[0].Page1[0].CheckBox2A[0]
topmostSubform[0].Page1[0].CheckBox2A[1]
topmostSubform[0].Page2[0].CheckBox2A[0]
topmostSubform[0].Page2[0].CheckBox2A[1] 
topmostSubform[0].Page3[0].CheckBox2A[0]
topmostSubform[0].Page3[0].CheckBox2A[1] 

I use the next line of code to fill CheckBox2A[0] on the second page.

fields.SetField("topmostSubform[0].Page2[0].CheckBox2A[0]", "1")

Instead of CheckBox2A[0] on the second page, CheckBox2A[0] on the first page gets checked.


回答1:


iTextSharp (and also iText for Java, tested here) does not correctly associate the reference derived from the XFA template structure

topmostSubform[0].Page2[0].CheckBox2A[0]

with the matching entry in the one XFA dataset:

<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" >
  <xfa:data >
    <topmostSubform >
<!-- vvv the incorrect match by iText -->
      <CheckBox2A >0</CheckBox2A >
<!-- ^^^ the incorrect match by iText -->
      <CheckBox2A >0</CheckBox2A >
      <CheckBox2B >0</CheckBox2B >
      <CheckBox2B >0</CheckBox2B >
      <Voorletters />
      <Achternaam />
      <CheckBox2C >0</CheckBox2C >
      <CheckBox2C >0</CheckBox2C >
      <DatumDag />
      <DatumMaand />
      <DatumJaar />
      <TextField1 />
      <HuisNrTekst5 />
      <HuisNrNummer5 />
      <Straat />
      <PostcodeNr1c />
      <PostcodeAlpha1c />
      <Plaats />
      <HuisNrTekst5 />
      <HuisNrNummer5 />
      <TextField1 />
      <PostcodeNr1c />
      <PostcodeAlpha1c />
      <Plaats />
      <TextField1 />
      <CheckBox2D >0</CheckBox2D >
      <CheckBox2D >0</CheckBox2D >
      <IBANREKC_1 />
      <IBANREKB_1 />
      <IBANREKA_1 />
      <IBAN_1 />
      <BurgerserviceNr />
      <Voorletters />
      <Achternaam />
      <CheckBox2E >0</CheckBox2E >
      <CheckBox2E >0</CheckBox2E >
      <HuisNrTekst5 />
      <HuisNrNummer5 />
      <Straat />
      <PostcodeNr1c />
      <PostcodeAlpha1c />
      <Plaats />
      <DatumDag />
      <DatumMaand />
      <DatumJaar />
      <IBANREKC_2 />
      <IBANREKB_2 />
      <IBANREKA_2 />
      <IBAN_2 />
      <Telefoon />
<!-- vvv the correct match -->
      <CheckBox2A >0</CheckBox2A >
<!-- ^^^ the correct match -->
      <CheckBox2A >0</CheckBox2A >
      <CheckBox2B >0</CheckBox2B >
      <CheckBox2B >0</CheckBox2B >
      <IBANREKC_1 />
      <IBANREKB_1 />
      <IBANREKA_1 />
      <IBAN_1 />
      <CheckBox2C >0</CheckBox2C >
      <CheckBox2C >0</CheckBox2C >
      <TextField1 />
      <TextField1 />
      <CheckBox2D >0</CheckBox2D >
      <CheckBox2D >0</CheckBox2D >
      <Telefoon />
      <CheckBox2E >0</CheckBox2E >
      <CheckBox2E >0</CheckBox2E >
      <CheckBox2F >0</CheckBox2F >
      <CheckBox2F >0</CheckBox2F >
      <TextField1 />
      <TextField1 />
      <CheckBox2G >0</CheckBox2G >
      <CheckBox2G >0</CheckBox2G >
      <CheckBox3B >0</CheckBox3B >
      <CheckBox3B >0</CheckBox3B >
      <CheckBox3B >0</CheckBox3B >
      <IBAN_1E_01 />
      <IBAN_1D_01 />
      <IBAN_1C_01 />
      <IBAN_1A_01 />
      <IBAN_1B_01 />
      <IBANREKC_1 />
      <IBANREKB_1 />
      <IBANREKA_1 />
      <IBAN_1 />
      <IBAN_1E_02 />
      <IBAN_1D_02 />
      <IBAN_1C_02 />
      <IBAN_1B_02 />
      <IBAN_1A_02 />
      <CheckBox3D >0</CheckBox3D >
      <CheckBox3D >0</CheckBox3D >
      <CheckBox3D >0</CheckBox3D >
      <CheckBox3A >0</CheckBox3A >
      <CheckBox3A >0</CheckBox3A >
      <CheckBox3A >0</CheckBox3A >
      <CheckBox2A >0</CheckBox2A >
      <CheckBox2A >0</CheckBox2A >
      <CheckBox3B >0</CheckBox3B >
      <CheckBox3B >0</CheckBox3B >
      <CheckBox3B >0</CheckBox3B >
      <DatumDag />
      <DatumMaand />
      <DatumJaar />
      <TextField1 />
      <DatumDag />
      <DatumMaand />
      <DatumJaar />
      <TextField1 />
      <Telefoon />
    </topmostSubform >
  </xfa:data >
</xfa:datasets >

Thus, the wrong dataset element is changed. I'm afraid this has to be looked into by iText development, I have no fix at hand.

You might be in luck, though: The form in your document actually is a hybrid with both an AcroForm and an XFA representation. During your fields.SetField call iText attempts to set the value in both representations, and indeed, in the AcroForm representation it sets the correct one.

Thus, if the result PDF is not required to carry that XFA structure anymore, you can simply drop the XFA structure:

using (var pdfReader = new PdfReader(file))
using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output))
{
    AcroFields fields = pdfStamper.AcroFields;
    fields.SetField("topmostSubform[0].Page2[0].CheckBox2A[0]", "1");
    fields.RemoveXfa();
}

Doing that you get the tick on page 2:



来源:https://stackoverflow.com/questions/28967737/itextsharp-setfield-for-fields-with-same-name-on-different-pages

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!