Source code for derobertis_cv.pdf_compressor
#!/usr/bin/env python3
# Author: Sylvain Carlioz
# 6/03/2017
# MIT license -- free to use as you want, cheers.
"""
Simple python wrapper script to use ghostscript function to compress PDF files.
Compression levels:
0: default
1: prepress
2: printer
3: ebook
4: screen
Dependency: Ghostscript.
On MacOSX install via command line `brew install ghostscript`.
"""
import argparse
import os.path
import subprocess
import sys
from shutil import copyfile
[docs]
def compress_pdf(input_file_path, output_file_path, power=0):
"""Function to compress PDF via Ghostscript command line interface"""
quality = {0: "/default", 1: "/prepress", 2: "/printer", 3: "/ebook", 4: "/screen"}
# Basic controls
# Check if valid path
if not os.path.isfile(input_file_path):
print("Error: invalid path for input PDF file")
sys.exit(1)
# Check if file is a PDF by extension
if input_file_path.split(".")[-1].lower() != "pdf":
print("Error: input file is not a PDF")
sys.exit(1)
print("Compress PDF...")
initial_size = os.path.getsize(input_file_path)
subprocess.call(
[
"gs",
"-sDEVICE=pdfwrite",
"-dCompatibilityLevel=1.4",
"-dPDFSETTINGS={}".format(quality[power]),
"-dNOPAUSE",
"-dQUIET",
"-dBATCH",
"-sOutputFile={}".format(output_file_path),
input_file_path,
]
)
final_size = os.path.getsize(output_file_path)
ratio = 1 - (final_size / initial_size)
print("Compression by {0:.0%}.".format(ratio))
print("Final file size is {0:.1f}MB".format(final_size / 1000000))
print("Done.")
[docs]
def main():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("input", help="Relative or absolute path of the input PDF file")
parser.add_argument(
"-o", "--out", help="Relative or absolute path of the output PDF file"
)
parser.add_argument(
"-c", "--compress", type=int, help="Compression level from 0 to 4"
)
parser.add_argument(
"-b", "--backup", action="store_true", help="Backup the old PDF file"
)
parser.add_argument(
"--open", action="store_true", default=False, help="Open PDF after compression"
)
args = parser.parse_args()
# In case no compression level is specified, default is 2 '/ printer'
if not args.compress:
args.compress = 2
# In case no output file is specified, store in temp file
if not args.out:
args.out = "temp.pdf"
# Run
compress_pdf(args.input, args.out, power=args.compress)
# In case no output file is specified, erase original file
if args.out == "temp.pdf":
if args.backup:
copyfile(args.input, args.input.replace(".pdf", "_BACKUP.pdf"))
copyfile(args.out, args.input)
os.remove(args.out)
# In case we want to open the file after compression
if args.open:
if args.out == "temp.pdf" and args.backup:
subprocess.call(["open", args.input])
else:
subprocess.call(["open", args.out])
if __name__ == "__main__":
main()