Both Landscape and 'click to render' are possible and easy, it just took a little digging.
Landscape Orientation
It's controlled using the css attribute @page, but when using @page CSS with Salesforce PDF generation, I have found you must put the css code in a separate stylesheet or the PDF Engine ignores it (or even prints it!)—and include the separate stylesheet using apex:
<apex:stylesheet value="{!URLFOR($Resource.StyleZip, 'basic.css')}"/>
To get landscape in your PDF (which works fine in my tests) you would make your stylesheet file (basic.css in above example) something like:
@page {
size: A4 landscape; /* A4 landscape (297mm×210mm) */ }
There is a nice reference on all of the things you can do with @page like set all page sizes, margins, floating bits, page numbering, headers, footers, even include vector graphics here (although I have not tested everything with the SF PDF engine so it may not do it all):
Introduction to page composition with CSS
Click to Render
To view in HTML with a link to 'Download as a PDF', we need to dynamically change the the page renderAs option using a controller. Fortunately, there is really simple example code for this (which oddly isn't mentioned) in a tutorial page about fonts. See:
Fonts Available When Using Visualforce PDF Rendering
The relevant bits are, VF Page:
<apex:page showHeader="false" standardStylesheets="false"
controller="SaveToPDF" renderAs="{! renderAs }">
<apex:form rendered="{! showPrintLink }" style="text-align: right; margin: 10px;">
<div><apex:commandLink action="{! print }" value="Save to PDF"/></div>
<hr/>
</apex:form> ...
And controller:
public with sharing class SaveToPDF {
// Determines whether page is rendered as a PDF or just displayed as HTML
public String renderAs { get; set; }
// Determines whether to show the "Save As PDF" interface
public Boolean getShowPrintLink() {
return ( (renderAs == null) || ( ! renderAs.startsWith('PDF')) );
}
// Action method to "print" to PDF
public PageReference print() {
renderAs = 'PDF';
return null;
}
}