from cStringIO import StringIO
from reportlab import rl_config
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter, A4
from reportlab.lib.units import inch
from reportlab.lib.colors import black,white,red,pink,green,blue,yellow,lightgrey
from PIL import Image
width, height = letter #keep for later
def add_fold_lines(c):
"""Add lines to show where to fold card"""
# choose some colors
c.setFillColor(lightgrey)
# line settings
c.setLineWidth(1)
c.setDash(1,5) #n points on, m off
# draw some lines
c.line(width/2,0,width/2,height) #vertical
c.line(0,height/2,width,height/2) #horz.
def put_in_front_picture(c,str_img,img_url):
assert not (str_img and img_url)
if img_url:
import urllib2
data=urllib2.urlopen(img_url).read()
else:
data=str_img
image_file = StringIO(data)
img = Image.open(image_file)
#resize image:
img=img.resize((width/2,height/2),Image.BILINEAR)
#c.drawImage caused AttributeError: jpeg_fh
c.drawInlineImage(img, x=width/2,y=0, width=width/2,
height=height/2)
def write_text(c,front_text,inside_text):
#call canvas.getAvailableFonts() to see all fonts
# change color
c.setFillColor(COLOR_FRONT)
c.setFont("Helvetica", 28)
line_pos=int(.4*height)
for line in front_text.split('\n'):
c.drawCentredString(3*(width/4), line_pos, line)
line_pos-=int(.05*height)
c.setFillColor(black)
c.setFont("Helvetica", 16)
c.rotate(180) #write text upside down so it's right when folded.
line_pos=-3*(height/4)
for line in inside_text.split('\n'):
c.drawCentredString(-width/4, line_pos, line)
line_pos-=int(.05*height)
#write branding text
c.rotate(180) #put back to right side up
c.setFont("Helvetica", 8)
c.drawCentredString(width/4, int(.13*height),
"Created while fondly thinking of you at")
c.drawCentredString(width/4, int(.1*height),
"http://utilitymill.com/utility/Greeting_Card_Generator")
def generate_card(IMG_FILE,IMG_URL,TEXT_FRONT,TEXT_INSIDE):
"""Main function to generate PDF and print to stdout. Designed to be
run as a CGI application."""
if not (IMG_FILE or IMG_URL):
print 'You must upload an image file or provide a URL to one'
return
tmp = StringIO()
#Canvas Setup
c = canvas.Canvas(tmp, pagesize=letter, pageCompression=0)
#If output size is important set pageCompression=1, but remember that, compressed documents
#will be smaller, but slower to generate. Note that images are always compressed, and this option will only
#save space if you have a very large amount of text and vector graphics on each page.
#Do I need 'MacRomanEncoding' for Macs?
#Note: 0,0 coordinate in canvas is bottom left.
c.setAuthor('Utility Mill - utilitymill.com/utility/greeting_card_generator')
c.setTitle('Beautiful, expensive greeting card created at utilitymill.com')
#add_fold_lines(c) #early feedback says lines aren't necessary. Uncomment here to put them in
put_in_front_picture(c,IMG_FILE,IMG_URL)
write_text(c,TEXT_FRONT.replace('\r',''),TEXT_INSIDE.replace('\r',''))
#The showPage method saves the current page of the canvas
c.showPage()
#The save method stores the file and closes the canvas.
c.save()
tmp.seek(0)
print 'Content-Type: application/pdf'
print tmp.read()
generate_card(IMG_FILE,IMG_URL,TEXT_FRONT,TEXT_INSIDE)