#!/usr/bin/python
# $Id: starter_block.py,v 1.8 2009/09/25 09:32:57 tm Exp $
#
# Block starter:
# Import a PDF page containing blocks and fill text and image
# blocks with some data. For each addressee of the simulated
# mailing a separate page with personalized information is
# generated.
# A real-world application would of course fill the blocks with data
# retrieved from some external data source.
#
# Required software: PPS 8 or above
# Required data: input PDF, image

from sys import exc_info
from traceback import print_tb
from PDFlib.PDFlib import *

def printf(format, *args):
    sys.stdout.write(format % args)
    
# This is where the data files are. Adjust as necessary.
searchpath = "../data"
outfile = "starter_block.pdf"
infile = "block_template.pdf"
imagefile = "new.jpg"

# Names of the person-related blocks contained on the imported page
addressblocks = ["name", "street", "city"]

# Data related to various persons used for personalization
persons = [
    ["Mr Maurizio Moroni", "Strada Provinciale 124", "Reggio Emilia"],
    ["Ms Dominique Perrier", "25, rue Lauriston", "Paris"],
    ["Mr Liu Wong", "55 Grizzly Peak Rd.", "Butte"]
]

# Static text simulates database-driven variable contents
intro = "Dear"
goodbye = "Yours sincerely,\nVictor Kraxi"
announcement = (
    "Our <fillcolor=red>BEST PRICE OFFER<fillcolor=black> includes today:"
    "\n\n"
    "Long Distance Glider\nWith this paper rocket you can send all your "
    "messages even when sitting in a hall or in the cinema pretty near "
    "the back.\n\n"
    "Giant Wing\nAn unbelievable sailplane! It is amazingly robust and "
    "can even do aerobatics. But it is best suited to gliding.\n\n"
    "Cone Head Rocket\nThis paper arrow can be thrown with big swing. "
    "We launched it from the roof of a hotel. It stayed in the air a "
    "long time and covered a considerable distance.\n\n"
    "Super Dart\nThe super dart can fly giant loops with a radius of 4 "
    "or 5 meters and cover very long distances. Its heavy cone point is "
    "slightly bowed upwards to get the lift required for loops.\n\n"
    "Visit us on our Web site at www.kraxi.com!"
)

# create a new PDFlib object
p = PDFlib()

try:
    p.set_parameter("SearchPath", searchpath)

    # This means we must check return values of load_font() etc.
    p.set_parameter("errorpolicy", "return")

    if (p.begin_document(outfile,
            "destination={type=fitwindow} pagelayout=singlepage") == -1):
        raise PDFlibException("Error: " + p.get_errmsg())

    p.set_info("Creator", "PDFlib starter sample")
    p.set_info("Title", "starter_block")

    # Open the Block template which contains PDFlib Blocks
    indoc = p.open_pdi_document(infile, "")
    if (indoc == -1):
        raise PDFlibException("Error: " + p.get_errmsg())

    # Open the first page and clone the page size
    inpage = p.open_pdi_page(indoc, 1, "cloneboxes")
    if (inpage == -1):
        raise PDFlibException("Error: " + p.get_errmsg())

    image = p.load_image("auto", imagefile, "")

    if (image == -1):
        raise PDFlibException("Error: " + p.get_errmsg())

    # Based on the imported page generate several pages with the blocks
    # being filled with data related to different persons
    for person in persons:
        # Start the output page with a dummy size
        p.begin_page_ext(10, 10, "")

        # Place the imported page on the output page, and clone all
        # page boxes which are present in the input page; this will
        # override the dummy size used in begin_page_ext().
        p.fit_pdi_page(inpage, 0, 0, "cloneboxes")

        # Option list for text blocks
        optlist = "encoding=winansi embedding"

        # Loop over all person-related blocks. Fill each block with the
        # corresponding entry of the persons array.
        for block_val_pair in zip(addressblocks, person):
            if (p.fill_textblock(inpage, block_val_pair[0], block_val_pair[1], optlist) == -1):
                printf("Warning: %s\n", p.get_errmsg())
                
        # Fill the "intro" block
        buf = "%s %s," % (intro, person[0])
        if (p.fill_textblock(inpage, "intro", buf, optlist) == -1):
            printf("Warning: %s\n", p.get_errmsg())

        # Fill the "announcement" block
        if (p.fill_textblock(inpage, "announcement", announcement,
                optlist) == -1):
            printf("Warning: %s\n", p.get_errmsg())

        # Fill the "goodbye" block
        if (p.fill_textblock(inpage, "goodbye", goodbye,
                optlist) == -1):
            printf("Warning: %s\n", p.get_errmsg())

        # Fill the image block
        if (p.fill_imageblock(inpage, "icon", image, "") == -1):
            printf("Warning: %s\n", p.get_errmsg())

        p.end_page_ext("")

    p.close_pdi_page(inpage)
    p.close_pdi_document(indoc)
    p.close_image(image)

    p.end_document("")

except PDFlibException:
    print("PDFlib exception occurred:\n[%d] %s: %s" %
	((p.get_errnum()), p.get_apiname(),  p.get_errmsg()))
    print_tb(exc_info()[2])

except Exception:
    print("Exception occurred: %s" % (exc_info()[0]))
    print_tb(exc_info()[2])

finally:
    p.delete()
