Changeset 243

Show
Ignore:
Timestamp:
07/21/05 00:03:12 (19 years ago)
Author:
jerome
Message:

Fixed the different PDF problems reported.

Location:
pkpgcounter/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • pkpgcounter/trunk/NEWS

    r240 r243  
    2222pkpgcounter News : 
    2323    
     24  * 1.59 : 
     25     
     26    - Major rewrite of the PDF parser to correctly handle all line endings. 
     27       
    2428  * 1.58 : 
    2529   
  • pkpgcounter/trunk/pkpgpdls/pdf.py

    r241 r243  
    5959        objects = {} 
    6060        inobject = 0 
     61        # objre = re.compile(r"\s*(\d+)\s+(\d+)\s+obj[<\s/]*") 
     62        objre = re.compile(r"\s?(\d+)\s+(\d+)\s+obj[<\s/]?") 
    6163        for fullline in self.infile.xreadlines() : 
    6264            parts = [ l.strip() for l in fullline.splitlines() ] 
     
    6769                    else : 
    6870                        lastcomment = line[2:] 
    69                 elif line.endswith(" obj") : 
     71                else : 
    7072                    # New object begins here 
    71                     (n0, n1, dummy) = line.split() 
    72                     (major, minor) = map(int, (n0, n1)) 
    73                     obj = PDFObject(major, minor, lastcomment) 
    74                     inobject = 1 
    75                 elif line.startswith("endobj") :     
    76                     try :         
    77                         # try to find a different version of this object 
    78                         oldobject = objects[major] 
    79                     except KeyError :     
    80                         # not found, so we add it 
    81                         objects[major] = obj 
     73                    result = objre.search(line) 
     74                    if result is not None : 
     75                        (major, minor) = map(int, line[result.start():result.end()].split()[:2]) 
     76                        obj = PDFObject(major, minor, lastcomment) 
     77                        obj.content.append(line[result.end():]) 
     78                        inobject = 1 
     79                    elif line.startswith("endobj") \ 
     80                      or line.startswith(">> endobj") \ 
     81                      or line.startswith(">>endobj") : 
     82                        # Handle previous object, if any 
     83                        if inobject : 
     84                            # only overwrite older versions of this object 
     85                            # same minor seems to be possible, so the latest one 
     86                            # found in the file will be the one we keep. 
     87                            # if we want the first one, just use > instead of >= 
     88                            oldobject = objects.setdefault(major, obj) 
     89                            if minor >= oldobject.minor : 
     90                                objects[major] = obj 
     91                            inobject = 0         
    8292                    else :     
    83                         # only overwrite older versions of this object 
    84                         # same minor seems to be possible, so the latest one 
    85                         # found in the file will be the one we keep. 
    86                         # if we want the first one, just use > instead of >= 
    87                         if minor >= oldobject.minor : 
    88                             objects[major] = obj 
    89                     inobject = 0         
    90                 else :     
    91                     if inobject : 
    92                         obj.content.append(line) 
     93                        if inobject : 
     94                            obj.content.append(line) 
    9395                         
    9496        # Now we check each PDF object we've just created. 
    9597        self.iscolor = None 
    96         newpageregexp = re.compile(r"(/Type) ?(/Page)[/ \t\r\n]", re.I) 
     98        newpageregexp = re.compile(r"(/Type)\s?(/Page)[/\s]", re.I) 
    9799        colorregexp = re.compile(r"(/ColorSpace) ?(/DeviceRGB|/DeviceCMYK)[/ \t\r\n]", re.I) 
    98100        pagecount = 0 
    99101        for object in objects.values() : 
    100102            content = "".join(object.content) 
    101             pagecount += len(newpageregexp.findall(content)) 
     103            count = len(newpageregexp.findall(content)) 
     104            pagecount += count 
    102105            if colorregexp.match(content) : 
    103106                self.iscolor = 1 
  • pkpgcounter/trunk/pkpgpdls/version.py

    r240 r243  
    2020# 
    2121 
    22 __version__ = "1.58" 
     22__version__ = "1.59" 
    2323 
    2424__doc__ = """pkpgcounter : a generic Page Description Languages parser."""