コード例 #1
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def __init__(self, spec):
     firstchar = int_value(spec.get("FirstChar", 0))
     lastchar = int_value(spec.get("LastChar", 0))
     widths = list_value(spec.get("Widths", [0] * 256))
     widths = dict((i + firstchar, w) for (i, w) in enumerate(widths))
     if "FontDescriptor" in spec:
         descriptor = dict_value(spec["FontDescriptor"])
     else:
         descriptor = {"FontName": spec.get("Name"), "Ascent": 0, "Descent": 0, "FontBBox": spec["FontBBox"]}
     PDFSimpleFont.__init__(self, descriptor, widths, spec)
     return
コード例 #2
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def get_colorspace(spec):
     if isinstance(spec, list):
         name = literal_name(spec[0])
     else:
         name = literal_name(spec)
     if name == "ICCBased" and isinstance(spec, list) and 2 <= len(spec):
         return ColorSpace(name, stream_value(spec[1]).dic["N"])
     elif name == "DeviceN" and isinstance(spec, list) and 2 <= len(spec):
         return ColorSpace(name, len(list_value(spec[1])))
     else:
         return PREDEFINED_COLORSPACE[name]
コード例 #3
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def __init__(self, descriptor, widths, default_width=None):
     self.descriptor = descriptor
     self.widths = widths
     self.fontname = descriptor.get("FontName", "unknown")
     if isinstance(self.fontname, PSLiteral):
         self.fontname = literal_name(self.fontname)
     self.ascent = num_value(descriptor.get("Ascent", 0))
     self.descent = num_value(descriptor.get("Descent", 0))
     self.default_width = default_width or descriptor.get("MissingWidth", 0)
     self.leading = num_value(descriptor.get("Leading", 0))
     self.bbox = list_value(descriptor.get("FontBBox", (0, 0, 0, 0)))
     return
コード例 #4
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def __init__(self, spec):
     try:
         self.basefont = literal_name(spec["BaseFont"])
     except KeyError:
         if STRICT:
             raise PDFFontError("BaseFont is missing")
         self.basefont = "unknown"
     try:
         (descriptor, widths) = FontMetricsDB.get_metrics(self.basefont)
     except KeyError:
         descriptor = dict_value(spec.get("FontDescriptor", {}))
         firstchar = int_value(spec.get("FirstChar", 0))
         lastchar = int_value(spec.get("LastChar", 255))
         widths = list_value(spec.get("Widths", [0] * 256))
         widths = dict((i + firstchar, w) for (i, w) in enumerate(widths))
     PDFSimpleFont.__init__(self, descriptor, widths, spec)
     return
コード例 #5
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def get_font(self, objid, spec):
     if objid and objid in self.fonts:
         font = self.fonts[objid]
     else:
         if STRICT:
             if spec["Type"] != LITERAL_FONT:
                 raise PDFFontError("Type is not /Font")
         # Create a Font object.
         if "Subtype" in spec:
             subtype = literal_name(spec["Subtype"])
         else:
             if STRICT:
                 raise PDFFontError("Font Subtype is not specified.")
             subtype = "Type1"
         if subtype in ("Type1", "MMType1"):
             # Type1 Font
             font = PDFType1Font(spec)
         elif subtype == "TrueType":
             # TrueType Font
             font = PDFTrueTypeFont(spec)
         elif subtype == "Type3":
             # Type3 Font
             font = PDFType3Font(spec)
         elif subtype in ("CIDFontType0", "CIDFontType2"):
             # CID Font
             font = PDFCIDFont(spec)
         elif subtype == "Type0":
             # Type0 Font
             dfonts = list_value(spec["DescendantFonts"])
             assert dfonts
             subspec = dict_value(dfonts[0]).copy()
             for k in ("Encoding", "ToUnicode"):
                 if k in spec:
                     subspec[k] = resolve1(spec[k])
             font = self.get_font(None, subspec)
         else:
             if STRICT:
                 raise PDFFontError("Invalid Font: %r" % spec)
             font = PDFType1Font(spec)  # this is so wrong!
         if objid:
             self.fonts[objid] = font
     return font
コード例 #6
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def __init__(self, descriptor, widths, spec):
     # Font encoding is specified either by a name of
     # built-in encoding or a dictionary that describes
     # the differences.
     if "Encoding" in spec:
         encoding = resolve1(spec["Encoding"])
     else:
         encoding = LITERAL_STANDARD_ENCODING
     if isinstance(encoding, dict):
         name = literal_name(encoding.get("BaseEncoding", LITERAL_STANDARD_ENCODING))
         diff = list_value(encoding.get("Differences", None))
         self.encoding = EncodingDB.get_encoding(name, diff)
     else:
         self.encoding = EncodingDB.get_encoding(literal_name(encoding))
     self.ucs2_cmap = None
     if "ToUnicode" in spec:
         strm = stream_value(spec["ToUnicode"])
         self.ucs2_cmap = CMap()
         CMapParser(self.ucs2_cmap, StringIO(strm.get_data())).run()
     PDFFont.__init__(self, descriptor, widths)
     return
コード例 #7
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
    def init_resources(self, resources):
        self.fontmap = {}
        self.xobjmap = {}
        self.csmap = PREDEFINED_COLORSPACE.copy()
        # Handle resource declarations.
        def get_colorspace(spec):
            if isinstance(spec, list):
                name = literal_name(spec[0])
            else:
                name = literal_name(spec)
            if name == "ICCBased" and isinstance(spec, list) and 2 <= len(spec):
                return ColorSpace(name, stream_value(spec[1]).dic["N"])
            elif name == "DeviceN" and isinstance(spec, list) and 2 <= len(spec):
                return ColorSpace(name, len(list_value(spec[1])))
            else:
                return PREDEFINED_COLORSPACE[name]

        if resources:
            for (k, v) in dict_value(resources).iteritems():
                if 1 <= self.debug:
                    print >> stderr, "Resource: %r: %r" % (k, v)
                if k == "Font":
                    for (fontid, spec) in dict_value(v).iteritems():
                        objid = None
                        if isinstance(spec, PDFObjRef):
                            objid = spec.objid
                        spec = dict_value(spec)
                        self.fontmap[fontid] = self.rsrc.get_font(objid, spec)
                elif k == "ColorSpace":
                    for (csid, spec) in dict_value(v).iteritems():
                        self.csmap[csid] = get_colorspace(resolve1(spec))
                elif k == "ProcSet":
                    self.rsrc.get_procset(list_value(v))
                elif k == "XObject":
                    for (xobjid, xobjstrm) in dict_value(v).iteritems():
                        self.xobjmap[xobjid] = xobjstrm
        return
コード例 #8
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
 def render_contents(self, resources, contents, ctm=MATRIX_IDENTITY):
     self.init_resources(resources)
     self.init_state(ctm)
     self.execute(list_value(contents))
     return
コード例 #9
0
ファイル: pdfinterp.py プロジェクト: abduld/pdftoref
                elif char2 == None and isinstance(v, int):
                    char2 = v
                else:
                    if char2 == None:
                        for (i, w) in enumerate(v):
                            dic[char1 + i] = w
                    else:
                        for i in xrange(char1, char2 + 1):
                            dic[i] = v
                    char1 = char2 = None
            return dic

        self.vertical = self.cmap.is_vertical()
        if self.vertical:
            # writing mode: vertical
            dic = get_width(list_value(spec.get("W2", [])))
            widths = dict((cid, w) for (cid, (d, w)) in dic.iteritems())
            self.disps = dict((cid, d) for (cid, (d, w)) in dic.iteritems())
            (d, w) = spec.get("DW2", [880, -1000])
            default_width = w
            self.default_disp = d
        else:
            # writing mode: horizontal
            widths = get_width(list_value(spec.get("W", [])))
            self.disps = {}
            default_width = spec.get("DW", 1000)
            self.default_disp = 0
        PDFFont.__init__(self, descriptor, widths, default_width)
        return

    def __repr__(self):