Fix T49281 PDF importer fails to read first page sometimes.
authorHoward Trickey <howard.trickey@gmail.com>
Fri, 6 Oct 2017 13:03:33 +0000 (09:03 -0400)
committerHoward Trickey <howard.trickey@gmail.com>
Fri, 6 Oct 2017 13:06:06 +0000 (09:06 -0400)
Fixed a case of chained trailer dictionaries, and then another
problem where decoder on byte string got errors on 8 bit bytes.

io_vector/__init__.py
io_vector/pdf.py

index 9c7015d3ba623ba023c241cdcf8f702cda8cf65d..74696ee4fa4cb5e14b263761f75234d67a091659 100644 (file)
@@ -21,8 +21,8 @@
 bl_info = {
   "name": "Adobe Illustrator / PDF / SVG",
   "author": "Howard Trickey",
-  "version": (1, 1),
-  "blender": (2, 78, 0),
+  "version": (1, 2),
+  "blender": (2, 79, 0),
   "location": "File > Import-Export > Vector files (.ai, .pdf, .svg)",
   "description": "Import Adobe Illustrator, PDF, and SVG",
   "warning": "",
index 57f15b697bc690c25ac5387df3fe7992222b72d4..e2e319917d81ab9e5ebb527b062268f3294a8ce2 100644 (file)
@@ -454,7 +454,6 @@ def GetPDFTrailerAndCrossrefs(s):
     crossrefs = {}
     d = None
     last_trailerdict = None
-    print("looking for crossref at", crossrefi)
     if s[crossrefi:crossrefi+4] != b'xref':
         # Could be Crossref stream
         (obj, j) = GetPDFObject(s, crossrefi)
@@ -555,7 +554,9 @@ def GetPDFTrailerAndCrossrefs(s):
         if last_trailerdict is None:
             last_trailerdict = trailerdict
         if 'Prev' in trailerdict:
-            crossrefi = trailerdict['Prev']
+            crossrefi = GetTypedValFromDictEntry(trailerdict, 'Prev', ONUM, s, crossrefs)
+            if crossrefi is None:
+                crossrefi = -1
         else:
             crossrefi = -1
     return (last_trailerdict, crossrefs)
@@ -842,7 +843,7 @@ def GetPDFStreamContents(contentsobj, s, crossrefs, dodecode=True):
       crossrefs: dict - maps (obj_number, gen_number) to byte offset in s
       dodecode: bool - should we decode too?
     Returns:
-      string - the contents (if dodecode, decoded using default (UTF-8) decoder)
+      string - the contents (if dodecode, decoded using latin1 decoder)
     """
 
     if not PDFObjHasType(contentsobj, OSTREAM):
@@ -902,7 +903,7 @@ def GetPDFStreamContents(contentsobj, s, crossrefs, dodecode=True):
                         print("FlateDecode with prediction didn't consume all bytes")
                 ans = ''.join(ansbytes)
             if dodecode:
-                ans = ans.decode()
+                ans = ans.decode(encoding='latin1', errors='ignore')
         else:
             if WARN:
                 print('unhandled stream filter', fname)