Last time I did something like this, I created a second view, with similar contents, but configured slightly differently (ie, configured for printing rather than screen).
Eg, the screen version of the view included a table view as usual. The print version of the view included a table view without any headers displayed, and with column and row lines hidden. Both table views would operate in exactly the same way otherwise (eg, use the same delegate/data source, or same bindings).
There may be a better way, but that's how I've done it.