Create nice unicode PDF using Python

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 | /> <ul style= | https://web.archive.org/web/20130510000000*/https://code.google.com/p/pyfpdf/downloads/detail?name=fpdf-1.7.hg.zip&can=2&q= | https://web.archive.org/web/20130510000000*/https://code.google.com/p/pyfpdf/downloads/detail?name=fpdf_unicode_font_pack.zip&can=2&q= | 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(urllib2.urlopen(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: <pre class= |

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: <span style=

| https://web.archive.org/web/20130510000000*/http://example.com/cgi-bin/myscript.py?lang=en&sid=2 | | https://web.archive.org/web/20130510000000*/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-8. Data from external source are used to create the pdf. You can use as many fonts as you have in the fpdf/font directory, just add those using pdf.add_font(). <a href= | 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
Proxy Information
Original URL
gemini://chirale.org/2013-05-10_1103.gmi
Status Code
Success (20)
Meta
text/gemini; charset=utf-8
Capsule Response Time
276.784824 milliseconds
Gemini-to-HTML Time
4.06384 milliseconds

This content has been proxied by September (ba2dc).