Easy PDF Templates
July 02, 2014
We have a standard contractor agreement we use at
work. It’s pretty cookie cutter but for every
contractor certain things needed to be edited. These edits included
name of the contractor, address, start date of the contract, etc.
After giving up on forms in LibreOffice, I found an elegant solution.
It turns out that LibreOffice od* files are just zipped XML. So I
created an Open Document Template(odt) file and replaced all the relevant
data with placeholders like __CONTRACTOR__
for contractor name. Then I
use a simple make file to:
- unzip the template
- fill in the placeholders using sed
- zip it back up
- convert it to a PDF
Here’s the Makefile:
all: Independent-Contractor-Agmt.pdf
CONTRACTOR=Foobar Industries
CONTRACTORLOCATION=Austin, TX
CONTRACTPERIOD=3 months
BEGINDATE=$(shell date +"%B %d, %Y")
ENDDATE=$(shell date -d "+$(CONTRACTPERIOD)" +"%B %d, %Y")
%.odt: %.ott
mkdir $*
cd $*; unzip ../$<
sed -i 's/__CONTRACTOR__/$(CONTRACTOR)/g' $*/content.xml
sed -i 's/__CONTRACTORLOCATION__/$(CONTRACTORLOCATION)/g' $*/content.xml
sed -i 's/__BEGINDATE__/$(BEGINDATE)/g' $*/content.xml
sed -i 's/__ENDDATE__/$(ENDDATE)/g' $*/content.xml
sed -i 's/__CONTRACTPERIOD__/$(CONTRACTPERIOD)/g' $*/content.xml
cd $*; zip -r ../$@ *
rm -r $*
%.pdf: %.odt
unoconv -f pdf $<
clean:
rm -f *.odt
rm -f *.pdf
And here’s how I run it from the command line:
make all CONTRACTOR="Contracts R Us" \
CONTRACTORLOCATION="1234 Fantasy Ln, Austin, TX"
There are defaults for all the placeholders in the Makefile and you can override
them on the command line. For example, BEGINDATE
is the current date
by default. I originally tried using m4 instead of sed but it wasn’t
able to parse the XML file. This is just another example of doing things
the UNIX WayTM.