#! python from __future__ import print_function import fitz import sys, os, subprocess, tempfile, time ''' Optimizes a PDF with FileOptimizer. But as "/Producer" and "/Creator" get spoiled by this, we first save metadata and restore it after optimization. This means we also accept non-compressed object definitions (as created by FileOptimizer). ''' assert len(sys.argv) == 2, "need filename parameter" fn = sys.argv[1] assert fn.lower().endswith(".pdf"), "must be a PDF file" fullname = os.path.abspath(fn) # get the full path & name t0 = time.clock() # save current time doc = fitz.open(fullname) # open PDF to save metadata meta = doc.metadata doc.close() t1 = time.clock() # save current time again subprocess.call(["fileoptimizer64", fullname]) # now invoke FileOptimizer t2 = time.clock() # save current time again cdir = os.path.split(fullname)[0] # split dir from filename fnout = tempfile.mkstemp(suffix = ".pdf", dir = cdir) # create temp pdf name doc = fitz.open(fullname) # open now optimized PDF doc.setMetadata(meta) # restore old metadata doc.save(fnout[1], garbage = 4) # save temp PDF with it, a little sub opt doc.close() # close it os.remove(fn) # remove super optimized file os.close(fnout[0]) # close temp file os.rename(fnout[1], fn) # and rename it to original filename t3 = time.clock() # save current time again # put out runtime statistics print("Timings:") print(str(round(t1-t0, 4)).rjust(10), "save old metata") print(str(round(t2-t1, 4)).rjust(10), "execute FileOptimizer") print(str(round(t3-t2, 4)).rjust(10), "restore old metadata")