FattView/fpdf/examples/form.py
# -*- coding: iso-8859-1 -*-
import sys,os
from pyfpdf import FPDF
class Form:
def __init__(self, infile):
keys = ('name','type','x1','y1','x2','y2','font','size',
'bold','italic','underline','foreground','background',
'align','text','priority')
# parse form format file and create fields dict
self.fields = {}
for linea in open(infile).readlines():
kargs = {}
for i,v in enumerate(linea.split(";")):
if not v.startswith("'"):
v = v.replace(",",".")
else:
v = v#.decode('latin1')
if v=='':
v = None
else:
v = eval(v.strip())
kargs[keys[i]] = v
self.fields[kargs['name'].lower()] = kargs
self.handlers = {'T': self.text, 'L': self.line, 'I': self.image,
'B': self.rect, 'BC': self.barcode}
def set(self, name, value):
if name.lower() in self.fields:
self.fields[name.lower()]['text'] = value
def render(self, outfile):
pdf = FPDF()
pdf.add_page();
pdf.set_font('Arial','B',16);
for field in self.fields.values():
self.handlers[field['type'].upper()](pdf, **field)
pdf.output(outfile,"F")
def text(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=10,
bold=False, italic=False, underline=False, align="", *args, **kwargs):
if text:
font = font.strip().lower()
if font == 'arial black':
font = 'arial'
style = ""
if bold: style += "B"
if italic: style += "I"
if underline: style += "U"
align = {'I':'L','D':'R','C':'C','':'',None:None}[align]
pdf.set_font(font,style,size)
##m_k = 72 / 2.54
##h = (size/m_k)
pdf.set_xy(x1,y1)
pdf.cell(w=x2-x1,h=y2-y1,txt=text,border=0,ln=0,align=align)
#pdf.Text(x=x1,y=y1,txt=text)
def line(self, pdf, x1=0, y1=0, x2=0, y2=0, size=0, *args, **kwargs):
pdf.set_line_width(size)
pdf.line(x1, y1, x2, y2)
def rect(self, pdf, x1=0, y1=0, x2=0, y2=0, size=0, *args, **kwargs):
pdf.set_line_width(size)
pdf.rect(x1, y1, x2-x1, y2-y1)
def image(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', *args,**kwargs):
pdf.image(text,x1,y1,w=x2-x1,h=y2-y1,type='',link='')
def barcode(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=1,
*args, **kwargs):
font = font.lower().strip()
if font == 'interleaved 2of5 nt':
pdf.interleaved2of5(text,x1,y1,w=size)
if __name__ == "__main__":
f = Form("invoice.csv")
f.set("EMPRESA","Saraza")
f.set("logo","logo.png")
f.render("./invoice.pdf")
if sys.platform.startswith("linux"):
os.system("evince ./invoice.pdf")
else:
os.system("./invoice.pdf")