diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc index 19a1eb5..471abe8 100644 --- a/utils/pdfunite.cc +++ b/utils/pdfunite.cc @@ -164,6 +164,26 @@ void doMergeNameDict(PDFDoc *doc, XRef *srcXRef, XRef *countRef, int oldRefNum, } } +void doMergeFormDict(Dict *srcFormDict, Dict *mergeFormDict, int numOffset) { + Object srcFields, mergeFields; + + srcFormDict->lookup("Fields", &srcFields); + mergeFormDict->lookup("Fields", &mergeFields); + if (srcFields.isArray() && mergeFields.isArray()) { + for (int i = 0; i < mergeFields.arrayGetLength(); i++) { + Object value; + Object *newValue = new Object(); + mergeFields.arrayGetNF(i, &value); + newValue->initRef(value.getRef().num + numOffset, value.getRef().gen); + srcFields.arrayAdd(newValue); + value.free(); + delete newValue; + } + } + srcFields.free(); + mergeFields.free(); +} + /////////////////////////////////////////////////////////////////////////// int main (int argc, char *argv[]) /////////////////////////////////////////////////////////////////////////// @@ -360,7 +380,7 @@ int main (int argc, char *argv[]) annotsObj.free(); } } - Object pageCatObj, pageNames; + Object pageCatObj, pageNames, pageForm; docs[i]->getXRef()->getCatalog(&pageCatObj); Dict *pageCatDict = pageCatObj.getDict(); pageCatDict->lookup("Names", &pageNames); @@ -371,6 +391,15 @@ int main (int argc, char *argv[]) } doMergeNameDict(docs[i], yRef, countRef, 0, 0, names.getDict(), pageNames.getDict(), numOffset); } + pageCatDict->lookup("AcroForm", &pageForm); + if (i > 0 && !pageForm.isNull() && pageForm.isDict()) { + if (afObj.isNull()) { + pageCatDict->lookupNF("AcroForm", &afObj); + } else if (afObj.isDict()) { + doMergeFormDict(afObj.getDict(), pageForm.getDict(), numOffset); + } + } + pageForm.free(); pageNames.free(); pageCatObj.free(); objectsCount += docs[i]->writePageObjects(outStr, yRef, numOffset, gTrue);