public static void SetXfa(XfaForm form, PdfReader reader, PdfWriter writer) {
PdfDictionary af = (PdfDictionary)PdfReader.GetPdfObjectRelease(reader.Catalog.Get(PdfName.ACROFORM));
if (af == null) {
return;
}
PdfObject xfa = GetXfaObject(reader);
if (xfa.IsArray()) {
PdfArray ar = (PdfArray)xfa;
int t = -1;
int d = -1;
for (int k = 0; k < ar.Size; k += 2) {
PdfString s = ar.GetAsString(k);
if ("template".Equals(s.ToString())) {
t = k + 1;
}
if ("datasets".Equals(s.ToString())) {
d = k + 1;
}
}
if (t > -1 && d > -1) {
reader.KillXref(ar.GetAsIndirectObject(t));
reader.KillXref(ar.GetAsIndirectObject(d));
PdfStream tStream = new PdfStream(SerializeDoc(form.templateNode));
tStream.FlateCompress(writer.CompressionLevel);
ar[t] = writer.AddToBody(tStream).IndirectReference;
PdfStream dStream = new PdfStream(SerializeDoc(form.datasetsNode));
dStream.FlateCompress(writer.CompressionLevel);
ar[d] = writer.AddToBody(dStream).IndirectReference;
af.Put(PdfName.XFA, new PdfArray(ar));
return;
}
}
reader.KillXref(af.Get(PdfName.XFA));
PdfStream str = new PdfStream(SerializeDoc(form.domDocument));
str.FlateCompress(writer.CompressionLevel);
PdfIndirectReference refe = writer.AddToBody(str).IndirectReference;
af.Put(PdfName.XFA, refe);
}