[poppler] poppler/PDFDoc.cc poppler/PDFDoc.h utils/pdfunite.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Fri Jul 25 15:13:45 PDT 2014


 poppler/PDFDoc.cc |   46 ++++++++++++++++++++++++++++------------------
 poppler/PDFDoc.h  |    6 +++---
 utils/pdfunite.cc |    2 +-
 3 files changed, 32 insertions(+), 22 deletions(-)

New commits:
commit f2e4154eff52b86e62490a3ccba470824c9cf436
Author: Thomas Freitag <Thomas.Freitag at alfa.de>
Date:   Sat Jul 26 00:12:37 2014 +0200

    pdfseparate: additonal handling for annotations
    
    Bug #77549

diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index 3b3752f..f8ac85d 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -659,7 +659,7 @@ int PDFDoc::savePageAs(GooString *name, int pageNo)
   countRef = new XRef();
   Object *trailerObj = getXRef()->getTrailerDict();
   if (trailerObj->isDict()) {
-    markPageObjects(trailerObj->getDict(), yRef, countRef, 0);
+    markPageObjects(trailerObj->getDict(), yRef, countRef, 0, refPage->num, rootNum + 2);
   }
   yRef->add(0, 65535, 0, gFalse);
   writeHeader(outStr, getPDFMajorVersion(), getPDFMinorVersion());
@@ -669,7 +669,7 @@ int PDFDoc::savePageAs(GooString *name, int pageNo)
   getXRef()->getDocInfo(&infoObj);
   if (infoObj.isDict()) {
     Dict *infoDict = infoObj.getDict();
-    markPageObjects(infoDict, yRef, countRef, 0);
+    markPageObjects(infoDict, yRef, countRef, 0, refPage->num, rootNum + 2);
     if (trailerObj->isDict()) {
       Dict *trailerDict = trailerObj->getDict();
       Object ref;
@@ -698,11 +698,11 @@ int PDFDoc::savePageAs(GooString *name, int pageNo)
   Dict *pagesDict = pagesObj.getDict();
   pagesDict->lookup("Resources", &resourcesObj);
   if (resourcesObj.isDict())
-    markPageObjects(resourcesObj.getDict(), yRef, countRef, 0);
-  markPageObjects(catDict, yRef, countRef, 0);
+    markPageObjects(resourcesObj.getDict(), yRef, countRef, 0, refPage->num, rootNum + 2);
+  markPageObjects(catDict, yRef, countRef, 0, refPage->num, rootNum + 2);
 
   Dict *pageDict = page.getDict();
-  markPageObjects(pageDict, yRef, countRef, 0);
+  markPageObjects(pageDict, yRef, countRef, 0, refPage->num, rootNum + 2);
   pageDict->lookupNF("Annots", &annotsObj);
   if (!annotsObj.isNull()) {
     markAnnotations(&annotsObj, yRef, countRef, 0, refPage->num, rootNum + 2);
@@ -1426,16 +1426,26 @@ void PDFDoc::writeHeader(OutStream *outStr, int major, int minor)
    outStr->printf("%%\xE2\xE3\xCF\xD3\n");
 }
 
-void PDFDoc::markDictionnary (Dict* dict, XRef * xRef, XRef *countRef, Guint numOffset)
+void PDFDoc::markDictionnary (Dict* dict, XRef * xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum)
 {
   Object obj1;
   for (int i=0; i<dict->getLength(); i++) {
-    markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset);
+    const char *key = dict->getKey(i);
+    if (strcmp(key, "Annots") != 0) {
+      markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset, oldRefNum, newRefNum);
+    } else {
+      Object annotsObj;
+      dict->getValNF(i, &annotsObj);
+      if (!annotsObj.isNull()) {
+        markAnnotations(&annotsObj, xRef, countRef, 0, oldRefNum, newRefNum);
+        annotsObj.free();
+      }
+    }
     obj1.free();
   }
 }
 
-void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset)
+void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum)
 {
   Array *array;
   Object obj1;
@@ -1444,17 +1454,17 @@ void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffse
     case objArray:
       array = obj->getArray();
       for (int i=0; i<array->getLength(); i++) {
-        markObject(array->getNF(i, &obj1), xRef, countRef, numOffset);
+        markObject(array->getNF(i, &obj1), xRef, countRef, numOffset, oldRefNum, newRefNum);
         obj1.free();
       }
       break;
     case objDict:
-      markDictionnary (obj->getDict(), xRef, countRef, numOffset);
+      markDictionnary (obj->getDict(), xRef, countRef, numOffset, oldRefNum, newRefNum);
       break;
     case objStream: 
       {
         Stream *stream = obj->getStream();
-        markDictionnary (stream->getDict(), xRef, countRef, numOffset);
+        markDictionnary (stream->getDict(), xRef, countRef, numOffset, oldRefNum, newRefNum);
       }
       break;
     case objRef:
@@ -1480,7 +1490,7 @@ void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffse
         } 
         Object obj1;
         getXRef()->fetch(obj->getRef().num, obj->getRef().gen, &obj1);
-        markObject(&obj1, xRef, countRef, numOffset);
+        markObject(&obj1, xRef, countRef, numOffset, oldRefNum, newRefNum);
         obj1.free();
       }
       break;
@@ -1567,7 +1577,7 @@ void PDFDoc::replacePageDict(int pageNo, int rotate,
   page.free();
 }
 
-void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset) 
+void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) 
 {
   pageDict->remove("Names");
   pageDict->remove("OpenAction");
@@ -1583,7 +1593,7 @@ void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint n
 	      strcmp(key, "Annots") != 0 &&
 	      strcmp(key, "P") != 0 &&
         strcmp(key, "Root") != 0) {
-      markObject(&value, xRef, countRef, numOffset);
+      markObject(&value, xRef, countRef, numOffset, oldRefNum, newRefNum);
     }
     value.free();
   }
@@ -1631,7 +1641,7 @@ GBool PDFDoc::markAnnotations(Object *annotsObj, XRef *xRef, XRef *countRef, Gui
             obj2.free();
           }
           type.free();
-          markPageObjects(dict, xRef, countRef, numOffset);
+          markPageObjects(dict, xRef, countRef, numOffset, oldPageNum, newPageNum);
         }
         obj1.free();
         array->getNF(i, &obj1);
@@ -1681,7 +1691,7 @@ GBool PDFDoc::markAnnotations(Object *annotsObj, XRef *xRef, XRef *countRef, Gui
   return modified;
 }
 
-void PDFDoc::markAcroForm(Object *afObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum) {
+void PDFDoc::markAcroForm(Object *afObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) {
   Object acroform;
   GBool modified = gFalse;
   afObj->fetch(getXRef(), &acroform);
@@ -1690,11 +1700,11 @@ void PDFDoc::markAcroForm(Object *afObj, XRef *xRef, XRef *countRef, Guint numOf
       for (int i=0; i < dict->getLength(); i++) {
         if (strcmp(dict->getKey(i), "Fields") == 0) {
           Object fields;
-          modified = markAnnotations(dict->getValNF(i, &fields), xRef, countRef, numOffset, oldPageNum, newPageNum);
+          modified = markAnnotations(dict->getValNF(i, &fields), xRef, countRef, numOffset, oldRefNum, newRefNum);
           fields.free();
         } else {
           Object obj;
-          markObject(dict->getValNF(i, &obj), xRef, countRef, numOffset);
+          markObject(dict->getValNF(i, &obj), xRef, countRef, numOffset, oldRefNum, newRefNum);
           obj.free();
         }
       }
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index fdb7f3b..a73953c 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -248,7 +248,7 @@ public:
 
   // rewrite pageDict with MediaBox, CropBox and new page CTM
   void replacePageDict(int pageNo, int rotate, PDFRectangle *mediaBox, PDFRectangle *cropBox, Object *pageCTM);
-  void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset);
+  void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum);
   GBool markAnnotations(Object *annots, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum);
   void markAcroForm(Object *acrpForm, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum);
   // write all objects used by pageDict to outStr
@@ -267,8 +267,8 @@ public:
 
 private:
   // insert referenced objects in XRef
-  void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, Guint numOffset);
-  void markObject (Object *obj, XRef *xRef, XRef *countRef, Guint numOffset);
+  void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum);
+  void markObject (Object *obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum);
   static void writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset, Guchar *fileKey,
                                 CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen);
 
diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc
index b53e497..787b1f0 100644
--- a/utils/pdfunite.cc
+++ b/utils/pdfunite.cc
@@ -129,7 +129,7 @@ int main (int argc, char *argv[])
       }
       pages.push_back(page);
       offsets.push_back(numOffset);
-      docs[i]->markPageObjects(pageDict, yRef, countRef, numOffset);
+      docs[i]->markPageObjects(pageDict, yRef, countRef, numOffset, refPage->num, refPage->num);
       Object annotsObj;
       pageDict->lookupNF("Annots", &annotsObj);
       if (!annotsObj.isNull()) {


More information about the poppler mailing list