import sys class PdfName: def __init__(self, name, abr=''): self.fName = name self.fAbr = abr class PdfInteger: def __init__(self, value): self.fValue = value class PdfReal: def __init__(self, value): self.fValue = value class PdfString: def __init__(self, value): self.fValue = value class PdfBoolean: def __init__(self, value): self.fValue = value class PdfField: def __init__(self, parent, name, abr): self.fParent = parent self.fName = name self.fAbr = abr self.fDefault = '' self.fType = '' def must(self, value): return self.fParent def default(self, value): self.fDefault = value return self def number(self): self.fType = 'number' return self def integer(self): self.fType = 'integer' return self def real(self): self.fType = 'real' return self def name(self): self.fType = 'name' return self def string(self): self.fType = 'string' return self def multiple(self, options): self.fType = 'multiple' self.fOptions = options return self def done(self): return self.fParent class PdfClassField: def __init__(self, parent, required): self.fFields = [] self.fIncludes = [] self.fCC = [] self.fParent = parent self.fRequired = required def hasField(self, name, abr=''): return PdfField(self, name, abr) def done(self): return self.fParent class PdfClass: def __init__(self, name, base): self.fFields = [] self.fIncludes = [] self.fCC = [] self.fName = name self.fBase = base def required(self): field = PdfClassField(self, True) self.fFields.append(field) return field def optional(self): field = PdfClassField(self, False) self.fFields.append(field) return field def include(self, path): self.fIncludes.append(path) return self def carbonCopy(self, cc): self.fCC.append(cc) return self class PdfClassManager: def __init__(self): self.fClasses = [] def addClass(self, name, base=''): cls = PdfClass(name, base) self.fClasses.append(cls) return cls def write(self): return def generateCode(): all = PdfClassManager() all.addClass('Object') all.addClass('Null') all.addClass('Boolean') all.addClass('Integer') all.addClass('Real') all.addClass('Name') all.addClass('Stream') all.addClass('Reference') all.addClass('Array') all.addClass('Dictionary') all.addClass('XObject', 'Dictionary').required().hasField('/Type').must('/XObject') all.addClass('Image', 'XObject').required().hasField('/Type').must('/XObject').done()\ .required().hasField('/Subtype').must('/Image').done()\ .required().hasField('/Width', '/W').integer().done().done()\ .required().hasField('/Height', '/H').integer().done().done()\ .required().hasField('/ColorSpace').multiple([PdfName('/DeviceRGB', '/RGB'), PdfName('/DeviceGray', '/Gray')])\ .done()\ .done()\ .optional().hasField('/BitsPerComponent', '/BPC').multiple([PdfInteger(1), PdfInteger(2), PdfInteger(4), PdfInteger(8)])\ .default(PdfInteger(1))\ .done().done()\ .carbonCopy('SkBitmap bitmap;') all.addClass('Form', 'XObject').required().hasField('/Type').must('/XObject').done()\ .required().hasField('/Subtype').must('/Form').done() all.write() return 1 if '__main__' == __name__: sys.exit(generateCode())