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