Last active
December 16, 2015 23:30
-
-
Save tonetheman/5514477 to your computer and use it in GitHub Desktop.
git to make a super small pdf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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