[tldistro] libxpdf vs poppler

Jindrich Novy jnovy at redhat.com
Wed Apr 16 19:18:41 CEST 2008


Hi all,

On Wed, Apr 16, 2008 at 09:39:01AM +0200, Patrice Dumas wrote:
> On Mon, Apr 14, 2008 at 11:57:59PM +0200, Alexis Ballier wrote:
> > Hi,
> > 
> > I've seen some other distros patching texlive to use poppler. I can
> > easily see the pros (code sharing, less security issues, etc.) but also
> > see some cons: api changes in poppler, differing from what the texlive
> > team has been working with, possible subtle differences between the
> > two...
> 
> We use also libpoppler in fedora. I attach the patch. It is not the
> cleanest patch ever for the part relating with building against an
> external poppler, but it works.
> 
> > problems than it may cause ? Do different poppler releases require
> > code/patches adjustments ?
> 
> It is a bit young in fedora, but unless I am wrong there was a recent
> libpoppler ABI incompatible change, but it didn't required to change
> the texlive patch.

Please note that libpoppler needs to be patched in a way that ObjStream
class is visible to have pdftosrc successfully compiled. Attaching the
patch against libpoppler. It works also for the latest poppler 0.8.0.

Best,
Jindrich

--
Jindrich Novy <jnovy at redhat.com>   http://people.redhat.com/jnovy/
-------------- next part --------------
diff -up poppler-0.8.0/poppler-0.8.0/poppler/XRef.h.objstream poppler-0.8.0/poppler-0.8.0/poppler/XRef.h
--- poppler-0.8.0/poppler-0.8.0/poppler/XRef.h.objstream	2008-01-21 21:00:59.000000000 +0100
+++ poppler-0.8.0/poppler-0.8.0/poppler/XRef.h	2008-02-18 17:18:47.000000000 +0100
@@ -19,7 +19,36 @@
 class Dict;
 class Stream;
 class Parser;
-class ObjectStream;
+
+class ObjectStream {
+public:
+
+  // Create an object stream, using object number <objStrNum>,
+  // generation 0.
+  ObjectStream(XRef *xref, int objStrNumA);
+
+  ~ObjectStream();
+
+  // Return the object number of this object stream.
+  int getObjStrNum() { return objStrNum; }
+
+  // Get the <objIdx>th object from this stream, which should be
+  // object number <objNum>, generation 0.
+  Object *getObject(int objIdx, int objNum, Object *obj);
+
+  int *getOffsets() { return offsets; }
+  Guint getFirstOffset() { return firstOffset; }
+
+private:
+
+  int objStrNum;		// object number of the object stream
+  int nObjects;			// number of objects in the stream
+  Object *objs;			// the objects (length = nObjects)
+  int *objNums;			// the object numbers (length = nObjects)
+  int *offsets;			// the object offsets (length = nObjects)
+  Guint firstOffset;
+};
+
 
 //------------------------------------------------------------------------
 // XRef
@@ -106,6 +135,7 @@ public:
   int getSize() { return size; }
   XRefEntry *getEntry(int i) { return &entries[i]; }
   Object *getTrailerDict() { return &trailerDict; }
+  ObjectStream *getObjStr() { return objStr; }
 
   // Write access
   void setModifiedObject(Object* o, Ref r);
diff -up poppler-0.8.0/poppler-0.8.0/poppler/XRef.cc.objstream poppler-0.8.0/poppler-0.8.0/poppler/XRef.cc
--- poppler-0.8.0/poppler-0.8.0/poppler/XRef.cc.objstream	2008-01-21 21:00:59.000000000 +0100
+++ poppler-0.8.0/poppler-0.8.0/poppler/XRef.cc	2008-02-18 17:18:47.000000000 +0100
@@ -50,34 +50,9 @@
 // ObjectStream
 //------------------------------------------------------------------------
 
-class ObjectStream {
-public:
-
-  // Create an object stream, using object number <objStrNum>,
-  // generation 0.
-  ObjectStream(XRef *xref, int objStrNumA);
-
-  ~ObjectStream();
-
-  // Return the object number of this object stream.
-  int getObjStrNum() { return objStrNum; }
-
-  // Get the <objIdx>th object from this stream, which should be
-  // object number <objNum>, generation 0.
-  Object *getObject(int objIdx, int objNum, Object *obj);
-
-private:
-
-  int objStrNum;		// object number of the object stream
-  int nObjects;			// number of objects in the stream
-  Object *objs;			// the objects (length = nObjects)
-  int *objNums;			// the object numbers (length = nObjects)
-};
-
 ObjectStream::ObjectStream(XRef *xref, int objStrNumA) {
   Stream *str;
   Parser *parser;
-  int *offsets;
   Object objStr, obj1, obj2;
   int first, i;
 
@@ -85,6 +60,7 @@ ObjectStream::ObjectStream(XRef *xref, i
   nObjects = 0;
   objs = NULL;
   objNums = NULL;
+  offsets = NULL;
 
   if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) {
     goto err1;
@@ -105,6 +81,7 @@ ObjectStream::ObjectStream(XRef *xref, i
     goto err1;
   }
   first = obj1.getInt();
+  firstOffset = objStr.getStream()->getBaseStream()->getStart() + first;
   obj1.free();
   if (first < 0) {
     goto err1;
@@ -131,7 +108,7 @@ ObjectStream::ObjectStream(XRef *xref, i
       obj1.free();
       obj2.free();
       delete parser;
-      gfree(offsets);
+//       gfree(offsets);
       goto err1;
     }
     objNums[i] = obj1.getInt();
@@ -141,7 +118,7 @@ ObjectStream::ObjectStream(XRef *xref, i
     if (objNums[i] < 0 || offsets[i] < 0 ||
 	(i > 0 && offsets[i] < offsets[i-1])) {
       delete parser;
-      gfree(offsets);
+//       gfree(offsets);
       goto err1;
     }
   }
@@ -170,7 +147,7 @@ ObjectStream::ObjectStream(XRef *xref, i
     delete parser;
   }
 
-  gfree(offsets);
+//   gfree(offsets);
 
  err1:
   objStr.free();
@@ -187,6 +164,7 @@ ObjectStream::~ObjectStream() {
     delete[] objs;
   }
   gfree(objNums);
+  gfree(offsets);
 }
 
 Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) {


More information about the tldistro mailing list