💾 Archived View for chirale.org › 2013-05-10_1103.gmi captured on 2024-07-08 at 23:28:32. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-05-12)
-=-=-=-=-=-=-
Today I started one of the less motivating activities in Python x: encoding.
In Python 3 unicode will be everywhere, but as of the 6 version I’ve on one of the server I have to endure.
Objective: get data from a UTF-8 encoded json and print a nice PDF.
Tools: json, urllib2, fpdf, cgi
What you need:
pyfpdf:Â https://code.google.com/p/pyfpdf/downloads/list
https://code.google.com/p/pyfpdf/downloads/list
Now you have a working FPDF with unicode support and unicode fonts. Start to write your script, I assume you’re using python 6, if not change python6 to your python version (e.g. 7) or remove version number in the heading (just python). As now FPDF works with Python 5 to
Here I write a simple cgi-bin script, so you have to put it in the /var/www/cgi-bin directory (CentOS) or in /usr/lib/cgi-bin (Debian).
#!/usr/bin/env python6 #-*- coding: utf-8 -*- from fpdf import FPDF import json import urllib2 import os import cgi import sys # set system encoding to unicode import sys reload(sys) sys.setdefaultencoding("utf-8")
Now get some arguments from url. These will be used to compile a query to a external json service.
# e.g. http://example.com/cgi-bin/myscript.py?lang=en&sid=2 sid = arguments.getlist('sid')[0] lang = arguments.getlist('lang')[0] # compile a request to get a particular element from an external json dataurl = "http://example.com/external-json-source?lang=%s&sid=%s" % (lang, sid) # load json from dataurl and convert into python elements data = json.load(urlliburlopen(dataurl)) # the json has a user attribute: the user attribute has name and surname attributes as strings user = data['user'] # title is a simple string title = data['title']
Now you have to load the json from the external source. Json must be encoded in UTF-8:
lato_lungo = 297 lato_corto = 210 pdf = FPDF('L','mm','A4') # add unicode font pdf.add_font('DejaVu','','DejaVuSansCondensed.ttf',uni=True) pdf.add_page() pdf.cell(w=lato_lungo,h=9,txt=title,border=0,ln=1,align='L',fill=0) pdf.set_font('DejaVu','',12) # paragraphs rendered as MultiCell # @see https://code.google.com/p/pyfpdf/wiki/MultiCell # print key: values for each user['data'] dictionary attributes for val in user.iteritems(): pdf.multi_cell(w=0,h=5,txt="%s: %s" % val) # finally print pdf print pdf.output(dest='S')
Now:
Open your browser and visit http://example.com/cgi-bin/myscript.py?lang=en&sid=2 The external source http://example.com/external-json-source?lang=en&sid=2 is grabbed and converted into a python data structure. Both source and destination encoding are unicode utf- Data from external source are used to create the pdf.
http://example.com/cgi-bin/myscript.py?lang=en&sid=2
http://example.com/external-json-source?lang=en&sid=2
You can use as many fonts as you have in the fpdf/font directory, just add those using pdf.add_font().
https://code.google.com/p/pyfpdf/downloads/list
https://web.archive.org/web/20130510000000*/https://code.google.com/p/pyfpdf/downloads/list
https://web.archive.org/web/20130510000000*/http://example.com/cgi-bin/myscript.py?lang=en&sid=2
https://web.archive.org/web/20130510000000*/https://code.google.com/p/pyfpdf/downloads/list
https://web.archive.org/web/20130510000000*/https://code.google.com/p/pyfpdf/downloads/list</a></p>