Skip to content

Instantly share code, notes, and snippets.

@tonetheman
Last active December 16, 2015 23:30
Show Gist options
  • Save tonetheman/5514477 to your computer and use it in GitHub Desktop.
Save tonetheman/5514477 to your computer and use it in GitHub Desktop.
git to make a super small pdf
EOL = "\x0d\x0a"
class PDFMaker:
def __init__(self, filename):
self.outf = open(filename,"wb")
self.pos = 0
self.trans = []
self.objs = []
def incpos(self, size):
self.pos = self.pos + size
return self.pos
def getpos(self):
return self.pos
def write(self,msg):
before_pos = self.getpos()
self.outf.write(msg)
self.incpos(len(msg))
after_pos = self.getpos()
self.trans.append(("w", before_pos, after_pos, msg))
def writeln(self, msg):
self.write(msg)
self.write(EOL)
def make(self):
self.writeln("%PDF-1.7")
self.writecatalog()
self.writepages()
self.writexref()
self.writetrailer()
def close(self):
if self.outf:
self.outf.close()
self.outf = None
def dumptrans(self):
for t in self.trans:
print t
def writeobj(self, onum, streamdata):
self.objs.append((onum, self.getpos()))
self.writeln("%d 0 obj << %s >> endobj" % (onum, streamdata))
def writecatalog(self):
self.catalog_pos = self.getpos()
self.writeobj(1, "/Type /Catalog /Pages 2 0 R")
def writepages(self):
self.pages_pos = self.getpos()
self.writeobj(2, "/Type /Pages /Kids [3 0 R]")
# write single page
self.page_3_pos = self.getpos()
self.writeobj(3,"/Type /Page")
def writexref(self):
self.xref_pos = self.getpos()
self.writeln("xref")
# look at the index of the lowest object in the list
# len of the xref is the len of the objs
self.writeln("%d %d" % (self.objs[0][0], len(self.objs))) # start a 1 3 entries
for (oidx,opos) in self.objs:
ts = "%010d %05d n" % (opos,0)
self.writeln(ts)
def writetrailer(self):
self.trailer_pos = self.getpos()
self.writeln("trailer")
self.writeln("<</Size 2 /Root 1 0 R>>")
self.writeln("startxref")
self.writeln("%d" % (self.xref_pos,))
self.write("%%EOF")
PATH="out.pdf"
pdf = None
try:
pdf = PDFMaker(PATH)
pdf.make()
finally:
if pdf is not None:
pdf.close()
pdf.dumptrans()
print pdf.objs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment