Welcome, guest | Sign In | My Account | Store | Cart
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)

History

  • revision 2 (16 years ago)
  • previous revisions are not available