Skip to content

Instantly share code, notes, and snippets.

@mt3
Created June 10, 2012 19:25
Show Gist options
  • Save mt3/2907010 to your computer and use it in GitHub Desktop.
Save mt3/2907010 to your computer and use it in GitHub Desktop.
Jinja2 letter template example
#!/usr/bin/env python
#encoding=utf-8
"""
Seth Brown
Python 3.2
Blog post link: http://j.mp/H5Zrdn
"""
import os, sys, csv
from glob import iglob
from subprocess import Popen, PIPE
import jinja2
def wrapper(*args):
"""CLI wrapper"""
opts = [i for i in args]
cmd = [] + opts
process = Popen(cmd, stdout=PIPE)
process.communicate()[0]
return process
if __name__ == '__main__':
# change the default delimiters used by Jinja
# (prevent JinJa from interferring with LaTeX macros)
letter_renderer = jinja2.Environment(
block_start_string = '%{',
block_end_string = '%}',
variable_start_string = '%{{',
variable_end_string = '%}}',
loader = jinja2.FileSystemLoader(os.path.abspath('.')))
template = letter_renderer.get_template('letter_template.tex')
with open('addresses.txt') as infile:
reader = csv.DictReader(infile, delimiter=":")
os.mkdir("_letter_output")
for n, address in enumerate(reader):
output_dir = "_letter_output/"
outfile =''.join((sys.argv[1], "-", str(n) + ".tex"))
path = os.path.join(output_dir, outfile)
with open(path, mode="w") as letter:
letter.write(template.render(address = address))
os.chdir(output_dir)
[wrapper('/usr/texbin/xelatex', f) for f in iglob("*.tex")]
pdf_util = '/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py'
pdf_files = [p for p in iglob("*.pdf")]
wrapper(pdf_util, '-o', 'merged_letters.pdf', *pdf_files)
\today & Dear %{{ address.Name %}}, \\
& \\
\breakcell{%{{ address.Name %}} \\ %{{ address.A1 %}} \\ %{{ address.A2 %}}} &
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment