Paper SAS038-2014 
PDF vs. HTML: Can't We All Just Get Along? 
Scott Huntley, Cynthia Zender, SAS Institute 
ABSTRACT 
Have you ever asked, “Why doesn't my PDF output look just like my HTML output?” This paper explains the power 
and differences of each destination. You will learn how each destination works and understand why the output looks 
the way it does. Learn tips and tricks for how to modify your SAS
®
code to make each destination look more like the 
other. The tips span from beginner to advanced in all areas of reporting. Each destination is like a superhero, helping 
you transform your reports to meet all your needs. Learn how to use each ODS destination to the fullest extent of its 
powers. 
INTRODUCTION 
Superheroes are all different. Some superheroes have science and technology on their side (Ironman, Batman, 
Aquaman); some have super powers because they are from another planet or time (Thor, Superman); while others 
became accidental superheroes (Hulk, Spiderman). Just as superheroes are able to do marvelous things, in different 
ways, based on their abilities, each ODS destination has a set of abilities and superpowers based on the underlying 
architecture and purpose of the destination. This paper addresses two ODS destinations: PDF and HTML. 
CREATION STORY 
Every superhero has a creation story. PDF and HTML have creation stories too. HTML was probably the first ODS 
destination. With SAS version 7, ODS HTML and ODS RTF were initially introduced along with the ODS PRINTER 
destination. The PDF destination was not production until SAS 8.2. The underlying architecture of ODS dictated that 
style information (colors, fonts, borders, and so on) appropriate to each destination would be sent to each destination 
(using an ODS style template) along with the data from the SAS process or procedure. Then ODS would write 
instructions that could be rendered by a 3
rd
party application. 
ODS HTML initially created HTML 3.2 compliant HTML tags or elements, in SAS 7. The rendering application for 
HTML output was a web browser (although Microsoft Word and Microsoft Excel have been able to open HTML files 
ever since Office 97). Initially, with ODS the Printer family consisted of ODS PRINT, ODS PS and ODS PCL. When 
you wanted a PDF file, initially, you created a PostScript file and needed to distill it to PDF form. In SAS 8.2, the ODS 
PDF destination became production. 
Right from the beginning the underlying assumptions of HTML and PDF were different. HTML was designed for 
screen viewing.  PDF could be viewed on the screen but it creates output that is in a format that is readable by Adobe 
or other 3
rd
party products that consume PDF.  Basically it creates output that is printable.  What you see in a viewer 
like Acrobat will print out with the same appearance.  Another nice thing about the PDF destination was that it was a 
good way to deliver output that would be hard to change without using fancy Adobe editing tools. HTML was difficult 
to change, too, but mostly because not everyone knew HTML tags and instructions. But, HTML is not a “paged” 
destination, so things like page numbers and page breaks and printing control really work better in PDF than in HTML 
(where they are not used at all). The rendering browser controls how an HTML file will be printed, and to some extent 
you might be able to impact that printing using CSS @media instructions.  
WHAT IS MEASURED OUTPUT? 
The underlying architecture of PDF versus HTML has far-reaching impact on the output, beyond the concept of which 
application renders the output.  Now we can look at a concrete example. In the code below, two separate reports are 
created, taking all the defaults and changing orientation. Other changes are minor. HTML uses the default 
HTMLBLUE style template and PDF uses the PRINTER style. By default PDF also includes a bookmark area, but 
that feature is easily turned off with the NOTOC option. All the reports use SASHELP.CARS, which is delivered with 
Base SAS, so it should be easy to replicate these results. 
options orientation=portrait topmargin=.25in bottommargin=.25in  
leftmargin=.25in rightmargin=.25in number; 
ods html file='c:\temp\default1.html' style=htmlblue; 
Pdf fillable forms - C# PDF Form Data fill-in Library: auto fill-in PDF form data in C#.net, ASP.NET, MVC, WinForms, WPF
Online C# Tutorial to Automatically Fill in Field Data to PDF
allow users to attach to pdf form; create fillable pdf form from word
Pdf fillable forms - VB.NET PDF Form Data fill-in library: auto fill-in PDF form data in vb.net, ASP.NET, MVC, WinForms, WPF
VB.NET PDF Form Data fill-in library: auto fill-in PDF form data in vb.net, ASP.NET, MVC, WinForms, WPF
pdf fillable form creator; c# fill out pdf form
ods pdf file='c:\temp\default1_portrait.pdf' style=printer notoc; 
proc report data=sashelp.cars nowd; 
title 'Default Output Portrait Orientation'; 
footnote 'The Footnote'; 
run; 
ods _all_ close; 
options orientation=landscape topmargin=.25in bottommargin=.25in  
leftmargin=.25in rightmargin=.25in number; 
ods html file='c:\temp\default2.html' style=htmlblue; 
ods pdf file='c:\temp\default2_portrait.pdf' style=printer notoc; 
proc report data=sashelp.cars nowd; 
title 'Default Output Landscape Orientation'; 
footnote 'The Footnote'; 
run; 
ods _all_ close;
The HTML output is the same for both programs, as shown in Display 1. The reason that both outputs are the same 
is that HTML does not use the ORIENTATION option. Everything for HTML is written to a single HTML file, which 
represents one (1) web “page”. It is somewhat odd that the HTML specification has uses the term “page” to describe 
what is being displayed, since a single web page could be 5000 observations long, definitely too much to be printed 
on one physical page. And, as the annotations in red point out, on the HTML page, there is a single title at the top of 
the browser display and a single footnote at the bottom of the browser display. 
Display 1. Partial HTML Results 
However, with PDF output, the concept of measured output comes into play. What is measured output in regard to 
ODS PDF?  “Measured output” means ODS will determine the amount of available space for output.  Unlike HTML 
the PDF destination is very concerned about height and width of output objects such as tables, text, graphs, and 
images.  A good analogy is to think about a piece of paper.  How much output can you fit on that paper?  The height 
and width of the paper is fixed. Therefore, we have to make sure our output fits perfectly.  ODS has to take 
measurable factors into account, including, but not limited to, paper-size being used, system margins, orientation of 
the output and font size of the output. This means that Printer family output, including ODS PDF is bound by physical 
limitations.  
C# Create PDF Library SDK to convert PDF from other file formats
Free PDF creator SDK for Visual Studio .NET. Batch create adobe PDF from multiple forms. Create fillable PDF document with fields.
convert html form to pdf fillable form; convert pdf form fillable
C# PDF Field Edit Library: insert, delete, update pdf form field
provide best ways to create PDF forms and delete PDF forms in C#.NET framework project. A professional PDF form creator supports to create fillable PDF form in
auto fill pdf form from excel; convert an existing form into a fillable pdf
For example, the Portrait output is 26 pages and the Landscape output is 18 pages. What’s the reason for the 
difference? In the Portrait output, the results do not all fit on a hypothetical piece of 8 ½ x 11 paper. As shown in 
Display 2, the PDF output displays variables Make -- Invoice on page 1 and then for that same group of observations, 
displays variables EngineSize -- Length on page 2. On the other hand, with the landscape orientation, all of the 
variables can be displayed in landscape mode. Therefore, the page count is different. 
The other concept of measured output is shown in both Display 2 and Display 3. This output shows how ODS 
measured the placement of the report rows, titles, and footnotes based on the fact that every character and report 
row and text string in the output must be accounted for when ODS PDF lays out the page in memory before writing to 
the output file (either the default file or the file you specify with the FILE= option). 
Display 2. Partial PDF Results Orientation=Portrait 
When you download the programs that accompany this paper, you will see that we also applied a LABEL to some of 
the variables to make the Header cells smaller, such as using ‘HP’ for HorsePower and ‘DT’ for DriveTrain. Notice 
how the SAS title and footnote statements were used in the measured PDF output. The title and footnote appears at 
the top and bottom of each page, as they would, if you routed this output to a physical printer. In addition, the 
NUMBER system option was used to place page numbers in the PDF (but not the HTML) output. 
C# Create PDF from OpenOffice to convert odt, odp files to PDF in
An advanced .NET control to change ODT, ODS, ODP forms to fillable PDF formats in Visual C# .NET. Online source code for C#.NET class.
create a writable pdf form; pdf fillable forms
VB.NET Create PDF from OpenOffice to convert odt, odp files to PDF
Export PDF document from OpenOffice Presentation. Turn ODT, ODS, ODP forms into fillable PDF formats. Quick integrate online source code to VB.NET class project
convert excel spreadsheet to fillable pdf form; change font size in pdf fillable form
Display 3. Partial PDF Results Orientation=Landscape 
Now that we have shown some fundamental differences between HTML and PDF output, we can discuss more about 
how to take control of your output, beyond simple tricks like changing the labels. 
HOW TO SIZE YOUR OUTPUT 
Since PDF adheres to the concept of measured output, there is more you can do with PDF in terms of controlling the 
size of your output to maximize space on a physical page. For HTML, it is not so critical to maximize space on a 
physical page, since the concept of physical pages is not relevant to HTML. When we show some of the controls that 
apply to PDF, we will also show how those changes impact the HTML output. 
One easy change to impact PDF output is to change margins and orientation as shown in the Display 2 and 3 and 
this will, in turn, impact number of pages that “fit” in each orientation. Other ways exist to impact the size of the 
output, one such is font size. We can make two simple changes to the PROC REPORT output to show how font size 
and cell padding can impact output. Consider the following change to the PROC REPORT code: 
proc report data=sashelp.cars nowd 
style(report)={fontsize=9pt cellpadding=2px} 
style(header)={fontsize=9pt} 
style(column)={fontsize=9pt}; 
As shown in Display 4, the PDF output, now fits in 8 portrait pages instead of the 26 pages before. The reason for this 
difference is that those 2 simple changes allowed ODS to “measure” the PDF output differently, so that all the 
variables in the report row would fit into one portrait page. Although landscape output is not shown, using these same 
style overrides with PDF output caused the number of landscape pages to shrink to 11 pages instead of the original 
18 pages. 
VB.NET Create PDF Library SDK to convert PDF from other file
Batch create adobe PDF document from multiple forms in VB.NET. Create fillable PDF document with fields in Visual Basic .NET application.
create a pdf form to fill out; convert pdf to form fillable
C# PDF Text Box Edit Library: add, delete, update PDF text box in
Able to create a fillable and editable text box to PDF Since RasterEdge XDoc.PDF SDK is based on .NET framework ASP.NET web service and Windows Forms for any
convert an existing form into a fillable pdf form; create fillable form from pdf
Display 4. Partial PDF Results with Font and Cell Padding Changes 
The idea of changing font size and making it smaller might be an obvious change, but why does cell padding work? 
Cell padding is the amount of white space that “cushions” the letters in the cell. To see the impact of cell padding, we 
can change the cell padding to be a very big number (like 20 px) and then look at the output again, as shown in 
Display 5. 
Display 5. Partial PDF Results with Font and Large Cell Padding Changes 
With this unusually large value for cell padding, the report row is again, too wide to fit on one portrait page and the 
number of total pages in the output has increased to 40. These considerations do have an impact on HTML, as 
shown in Display 6, but not as dramatic as increasing or decreasing the number of pages, because the only thing that 
happens is that you scroll a bit more or a bit less in the browser. Even though there are no page breaks, you can use 
these techniques with HTML to impact how much content fits on a single screen. 
Display 6. Partial HTML Results with Font and Cell Padding Changes 
PAGES OF OUTPUT (OR WHAT IF MY OUTPUT IS TOO TALL) 
So far, the control over page breaking has been “implicit” or implied paging. When there are too many report rows to 
fit on a page (in paged destinations), a new page of output is started. The SAS titles and footnotes will take up space 
on every page in paged destinations, like PDF, but will appear only at the top and bottom of the output table in HTML.  
We can move outside the world of the simple listing report and talk about explicit page breaking. An explicit page 
break is one that is inserted in procedure output by procedure controls, such as using the PAGE dimension in PROC 
TABULATE or the PAGE option in PROC REPORT or BY and PAGEBY with PROC PRINT. Since ODS destinations, 
except for LISTING, do not use LINESIZE and PAGESIZE options.  
One simple way to break up the output is to add explicit page breaks using procedure controls. To that end, we will 
start with a switch of procedures and show implicit page breaks with PROC TABULATE and then explicit page breaks 
with a few other procedures. 
The code that we are starting with is shown below:
ods html file='c:\temp\demo2_implicit_page.html' style=htmlblue; 
ods pdf file='c:\temp\demo2_implicit_page.pdf' style=printer; 
proc tabulate data=sashelp.cars; 
title '1) Implicit Page Break from Procedure'; 
where make in ('Audi', 'Volvo', 'BMW', 'Chevrolet') and 
type in ('Sedan', 'Wagon'); 
class make model type; 
var msrp mpg_highway mpg_city; 
table make * model, 
type*mean*(msrp mpg_highway mpg_city); 
run; 
ods _all_ close; 
There are so many values for MAKE and MODEL that the TABULATE output is difficult to read, as shown in Display 
7.  
Display 7. PDF Results from PROC TABULATE with Implicit Page Breaks 
But, with a change to the table statement to create a PAGE dimension results in the output shown in Display 8. 
table make, 
model, 
type*mean*(msrp mpg_highway mpg_city); 
Display 8. PDF Results from PROC TABULATE with Explicit Page Breaks 
Using the same page dimension technique with HTML causes a slightly different result. Using the default HTMLBLUE 
style, there is a horizontal rule at the logical page break. In addition, the SAS title repeats at the top of the table and, if 
there were a footnote, the footnote would appear under the table on each logical page. 
Display 9. HTML Results from PROC TABULATE with Explicit Page Breaks 
If you have a browser that supports CSS (Cascading Style sheets), you might be grateful that the horizontal rule is 
there. In the style template, the horizontal rule comes with a CSS instruction for page breaking: 
class html                                                               
"Common HTML text used in the default style" /                        
'expandAll' = "<span onclick=""expandCollapse()"">"                   
'posthtml flyover line' = "</span><hr size=""3""/>"                   
'prehtml flyover line' = "<span><hr size=""3""/>"                     
'prehtml flyover bullet' = %nrstr("<span><b>&#183;</b>")              
'posthtml flyover' = "</span>"                                        
'prehtml flyover' = "<span>"                                          
'break' = "<br/>"                                                     
'Line' = "<hr size=""3""/>"                                           
'PageBreakLine' =                                                     
"<p style=""page-break-after: always;""><br/></p><hr size=""3""/>"    
'fake bullet' = %nrstr("<b>&#183;</b>");   
This means that when you print from a browser, such as Internet Explorer, if the CSS command is respected, the 
page break command will be used by the browser, as shown in Display 10. 
Display 10. HTML Results Displayed in Internet Explorer’s Print Preview Mode 
However, once the style is changed to a different style like SEASIDE, the horizontal rule disappears as shown in 
Display 11, but the title and footnote repeat for every logical page.  
Of course, the quickest way to generate either physical or logical pages with either PDF or HTML is to use BY-group 
processing. Consider Display 12, a listing report that uses a BY statement added to PROC REPORT. Just remember 
that anytime you use BY-group processing the data must be sorted or indexed on the BY variables. 
proc sort data=sashelp.cars out=cars;   by make type; 
where make in ('Audi', 'Volvo', 'BMW', 'Chevrolet') and 
type in ('Sedan', 'Wagon'); 
run; 
ods html file='c:\temp\demo2_use_by.html' style=htmlblue; 
ods pdf file='c:\temp\demo2_use_by.pdf' notoc style=printer; 
proc report data=cars nowd;   by make type; 
run; 
ods _all_ close;
Display 11. HTML Results from PROC TABULATE Using SEASIDE Style 
Display 12. PDF Results from PROC REPORT Using BY-Group Processing 
10 
Documents you may be interested
Documents you may be interested