Welcome, guest | Sign In | My Account | Store | Cart
#! /usr/bin/python


# Originally found on http://www.mobileread.com/forums/showthread.php?t=25565

import getopt, sys
from pyPdf import PdfFileWriter, PdfFileReader

def usage ():
   
print """sjvr767\'s PDF Cropping Script.
Example:
my_pdf_crop.py -s -p 0.5 -i input.pdf -o output.pdf
my_pdf_crop.py --skip --percent 0.5 -input input.pdf -output output.pdf
\n
REQUIRED OPTIONS:
-p\t--percent
The factor by which to crop. Must be positive and less than or equal to 1.

-i\t--input
The path to the file to be cropped.
\n
OPTIONAL:
-s\t--skip
Skip the first page. Ouptut file will not contain the first page of the input file.

-o\t--output
Specify the name and path of the output file. If none specified, the script appends \'cropped\' to the file name.

-m\t--margin
Specify additional absolute cropping, for fine tuning results.
\t-m "
left top right bottom"
"""

    sys
.exit(0)

def cut_length(dictionary, key, factor):
        cut_factor
= 1-factor
        cut
= float(dictionary[key])*cut_factor
        cut
= cut / 4
       
return cut
               
def new_coords(dictionary, key, cut, margin, code = "tl"):
       
if code == "tl":
               
if key == "x":
                       
return abs(float(dictionary[key])+(cut+margin["l"]))
               
else:
                       
return abs(float(dictionary[key])-(cut+margin["t"]))
       
elif code == "tr":
               
if key == "x":
                       
return abs(float(dictionary[key])-(cut+margin["r"]))
               
else:
                       
return abs(float(dictionary[key])-(cut+margin["t"]))
       
elif code == "bl":
               
if key == "x":
                       
return abs(float(dictionary[key])+(cut+margin["l"]))
               
else:
                       
return abs(float(dictionary[key])+(cut+margin["b"]))
       
else:
               
if key == "x":
                       
return abs(float(dictionary[key])-(cut+margin["r"]))
               
else:
                       
return abs(float(dictionary[key])+(cut+margin["b"]))

try:
        opts
, args = getopt.getopt(sys.argv[1:], "sp:i:o:m:", ["skip", "percent=", "input=", "output=", "margin="])
except getopt.GetoptError, err:
       
# print help information and exit:
       
print str(err) # will print something like "option -a not recognized"
        usage
()
        sys
.exit(2)

skipone
= 0

for a in opts[:]:
       
if a[0] == '-s' or a[0]=='--skip':
                skipone
= 1

factor
= 0.8 #default scaling factor

for a in opts[:]:
       
if a[0] == '-p' or a[0]=='--factor':
               
if a[1] != None:
                       
try:
                                factor
= float(a[1])
                       
except TypeError:
                               
print "Factor must be a number."
                                sys
.exit(2) #exit if no appropriate input file

input_file
= None #no defualt input file
               
for a in opts[:]:
       
if a[0] == '-i' or a[0]=='--input':
               
if a[1] != None:
                       
try:
                               
if a[1][-4:]=='.pdf':
                                        input_file
= a[1]
                               
else:
                                       
print "Input file must be a PDF."
                                        sys
.exit(2) #exit if no appropriate input file
                       
except TypeError:
                               
print "Input file must be a PDF."
                                sys
.exit(2) #exit if no appropriate input file
                       
except IndexError:
                               
print "Input file must be a PDF."
                                sys
.exit(2) #exit if no appropriate input file
               
else:
                       
print "Please speicfy an input file."
                        sys
.exit(2) #exit if no appropriate input file

output_file
= "%s_cropped.pdf" %input_file[:-4] #default output

for a in opts[:]:
       
if a[0] == '-o' or a[0]=='--output':
               
if a[1]!= None:
                       
try:
                               
if a[1][-4:]=='.pdf':
                                        output_file
= a[1]
                               
else:
                                       
print "Output file must be a PDF."
                       
except TypeError:
                               
print "Output file must be a PDF."
                       
except IndexError:
                               
print "Output file must be a PDF."

margin
= {"l": 0, "t": 0, "r": 0, "b": 0}

for a in opts[:]:
       
if a[0] == '-m' or a[0]=='--margin':
               
if a[1]!= None:
                        m_temp
= a[1].strip("\"").split()
                        margin
["l"] = float(m_temp[0])
                        margin
["t"] = float(m_temp[1])
                        margin
["r"] = float(m_temp[2])
                        margin
["b"] = float(m_temp[3])
               
else:
                       
print "Error"

input1
= PdfFileReader(file(input_file, "rb"))

output
= PdfFileWriter()
outputstream
= file(output_file, "wb")

pages
= input1.getNumPages()

top_right
= {'x': input1.getPage(1).mediaBox.getUpperRight_x(), 'y': input1.getPage(1).mediaBox.getUpperRight_y()}
top_left
= {'x': input1.getPage(1).mediaBox.getUpperLeft_x(), 'y': input1.getPage(1).mediaBox.getUpperLeft_y()}
bottom_right
= {'x': input1.getPage(1).mediaBox.getLowerRight_x(), 'y': input1.getPage(1).mediaBox.getLowerRight_y()}
bottom_left
= {'x': input1.getPage(1).mediaBox.getLowerLeft_x(), 'y': input1.getPage(1).mediaBox.getLowerLeft_y()}

print('Page dim.\t%f by %f' %(top_right['x'], top_right['y']))

cut
= cut_length(top_right, 'x', factor)

new_tr
= (new_coords(top_right, 'x', cut, margin, code = "tr"), new_coords(top_right, 'y', cut, margin, code = "tr"))
new_br
= (new_coords(bottom_right, 'x', cut, margin, code = "br"), new_coords(bottom_right, 'y', cut, margin, code = "br" ))
new_tl
= (new_coords(top_left, 'x', cut, margin, code = "tl"), new_coords(top_left, 'y', cut, margin, code = "tl"))
new_bl
= (new_coords(bottom_left, 'x', cut, margin, code = "bl"), new_coords(bottom_left, 'y', cut, margin, code = "bl"))

if skipone == 0:
       
for i in range(0, pages):
                page
= input1.getPage(i)
                page
.mediaBox.upperLeft = new_tl
                page
.mediaBox.upperRight = new_tr
                page
.mediaBox.lowerLeft = new_bl
                page
.mediaBox.lowerRight = new_br
                output
.addPage(page)
else:
       
for i in range(1, pages):
                page
= input1.getPage(i)
                page
.mediaBox.upperLeft = new_tl
                page
.mediaBox.upperRight = new_tr
                page
.mediaBox.lowerLeft = new_bl
                page
.mediaBox.lowerRight = new_br
                output
.addPage(page)

output
.write(outputstream)
outputstream
.close()

History

  • revision 3 (12 years ago)
  • previous revisions are not available