I don't think there is any reason at all you couldn't make a PDF file served that parses velocity; I've done it with csvs and, well, jpegs (don't ask).
I'm pretty sure I did this at least once before, but I can't find the code easily. I will look.
It would be exactly the same way you mix/serve html/velocity. Just need to get the headers and formats right. (blank template):
#if (!$EDIT_MODE)
$response.setContentType("text/csv")
$response.addHeader("Content-Disposition", "attachment;filename=myfilename.csv")
$response.addHeader("Access-Control-Allow-Origin", "*")
#set ($puller=$dotcontent.pull("+structureName:building",0,"modDate desc"))
#foreach($con in $puller)
"$con.title", "$con.longTitle","$con.buildingCode"
#end
#end
But having a nice print.css should obviate this method! This isn't really a code issue.
M