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.
