Warning: the following post is pretty boring. Move on before it’s too late, or read on if you are a geek!

In my downtime between contracts, I decided it was high time I finally automated the process of generating my resume in a variety of formats. Most people rarely need to update their resumes, and when they do, they might only need to create one or two versions of it — say an HTML version and a Word version. It’s fairly easy for most people to just update their resume by hand and make a couple of different versions of it when the need arises.

Being a consultant, however, my needs are more complicated. My contracts are generally short in nature — ranging anywhere from one month to a year, which means 1) I have to update my resume frequently, and 2) I have a long list of consulting work that can make my resume look kind of disorganized – a year here, six months there, etc, so it’s ideal to be able to show a summary version of my resume, and allow a greater level of detail if necassary. I consult for various kinds of organizations, and I perform different kinds of work depending on the needs of the organization, which means that I want to be able to highlight different components of my skill set based on context. Moreover, my clients have different requirements for how they want to receive my resume, which means I typically need to be able to provide my resume in at least four formats: HTML, Word, PDF, or Plain Text.

Add all of these requirements together, and you can see that maintaining my resume manually is a major league in the butt. It quickly becomes cumbersome to make sure all the formats are up to date, that I can provide a detailed or summary level view of my work, and that all of the different versions are in sync across formats.

My goal was to have a model driven, single document containing all of my information, and use that document as a ‘system of record’ from which any number of views and formats could be generated. When I was in graduate school, I actually created a resume exactly along these lines in a Document Engineering class. The document was written in XML, compliant with an XML Schema that I had designed. I refined the schema and the document, and used it as my starting point. The schema itself was designed to be finely grained and applicable to any technically-oriented resume. Once the model and document were completed, I turned towards generating the necassary views.

For the HTML version, I wrote a series of PHP classes representing the various objects in my XML resume: Person, Qualifications, Degrees, Experience, Projects and Publications, etc. I then simply read in the XML document, loaded the objects, and generated two different views: an overview and a detail view. I chose to develop PHP objects rather than use a simple XML transform because ultimately I would like to use these objects for a more graphical, dynamic representation of my skill set. For now, though, I simply wanted to dynamically generate the content that I wanted to display on my website.

That was the easy part. The challenge came when I needed to replicate these views as text, pdf and html. I spent a lot of time screwing around with LaTex/Tex and various PHP classes and talking to several people before finally opting to use XSL-FO, (aka XSL 1.0), and the Apache FOP processor to get the job done. I’ve got to say that the latest version of FOP (0.9.2) is the cat’s meow. Using FOP, it was possible to use a single XSL stylesheet to publish to RTF (Readable in Word) and PDF.

I spent more time than I would have liked solving my resume problems, but the outcome is that I never have to hand edit my resume in multiple formats again. That’s well worth the work. My resume itself also showcases some of my technical skills in XML, PHP and CSS. All of the code used to generate my resume is available in the code examples area of my website. If you want to use any of the code to generate your own resume, feel free to download and use all of the code. The XML document containing my resume is also available. Just ask if you need help, and please give credit where it’s due.