asp net pdf viewer control c# : Break password on pdf control software system azure winforms html console PharmaSUG-2012-AD140-part1689

Page 1 of 36 
PharmaSUG 2012 – AD14 
Creating Define.pdf with SAS
®
Version 9.3 ODS RTF 
Elizabeth Li, PharmaStat, LLC, Newark, CA 
Carl Chesbrough, PharmaStat, LLC, Newark, CA 
Abstract 
It is becoming more common for regulatory submissions to include define.xml - the data 
definition documents for Study Data Tabulations Model (SDTM) data, Analysis Data Model 
(ADaM) data, and even legacy data.  Although define.xml documents can help regulatory 
reviewers to navigate submission datasets, documents and variable derivations, they usually do 
not print out properly on paper.  One solution is to generate a define.pdf document with the same 
content as the define.xml.  The portable document format (PDF) file includes bookmarks and 
hyperlinks to facilitate online review, and it can also be printed out for hardcopy review.  
Providing define.pdf documents can help sponsors remove obstacles to the review of their 
regulatory submissions. 
This paper presents tips for using SAS
®
Version 9.3 Output Delivery System (ODS) rich text 
format (RTF) to generate an RTF file, and then use Acrobat’s PDF Maker to convert it to a 
define.pdf document.  It discusses reasons for the use of ODS RTF instead of ODS PDF.  It 
demonstrates how to create a user-defined style using SAS
®
PROC TEMPLATE.  It shows how 
to use RTF code to set up bookmarks and hyperlinks to internal as well as external locations.  It 
provides examples of using other RTF code to improve formatting of the RTF document.  The 
features of bookmarks, hyperlinks, headings, and other formatting details are important to an 
online review of any document. 
Key Words  
Define.pdf, SAS
®
ODS, RTF, define.xml, bookmark, hyperlink 
Introduction 
In a regulated industry such as pharmaceutical and biotechnology industry, product submissions 
for marketing approval currently require define.xml (data definition) files for study data 
tabulation model (SDTM).  It is a good idea to include define.xml files for analysis data model 
(ADaM), and/or legacy (Item 11) data, even though they are not required at this time.  Although 
define.xml files can help the reviewers to navigate submission documents, datasets, and variable 
definitions, they usually do not print out properly on paper.  One solution is to generate a 
define.pdf file, which contains the same contents as the define.xml file.  The portable document 
format (PDF) file not only includes bookmarks and hyperlinks to allow online review, but also 
can be printed for hardcopy review.  In the industry, every effort is made by sponsors to reduce 
Break password on pdf - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
can't select text in pdf file; break pdf into pages
Break password on pdf - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
acrobat separate pdf pages; split pdf into individual pages
Page 2 of 36 
the review time of regulatory submissions.  Generating define.pdf files may ease the review, 
hence may reduce the review time. 
This paper presents tips for using SAS
®
Version 9.3 Output Delivery System (ODS) rich text 
format (RTF) to generate a PDF file (define.pdf) via conversion from RTF file by Acrobat’s PDF 
Maker, for Study Data Tabulations Model (SDTM), Analysis Data Model (ADaM) or legacy 
(Item 11) data.  In the following sections, detailed descriptions will be presented for the features 
of a typical define.pdf file, why to use ODS RTF instead of ODS PDF, how to use SAS
®
PROC 
TEMPLATE to create a user-defined style for RTF outputs, how to use RTF code to set up 
bookmarks and hyperlinks to internal/external locations, as well as other RTF formatting details. 
Description of a Typical define.pdf File 
There are three major features of a typical define.pdf file: 
1. It should include the same contents as the define.xml, which is viewed through a stylesheet 
using a web browser.  The contents include study information, references to additional 
documents (e.g., annotated case report form (aCRF) and/or data guides), dataset information, 
variable-level metadata, value-level metadata, computational methods, and controlled 
terminologies (i.e. code lists and external dictionaries).   
2. It should contain bookmarks and hyperlinks to access information during an online review.  
A bookmark contains a marker or address that identifies a document or a specific place 
within the document.  A hyperlink links to another place in the same document or to an 
entirely different document.  Bookmarks and hyperlinks provide regulatory reviewers the 
option to review online.  
3. A define.pdf should incorporate the define.xml contents within printable space of a 
document.  This enables the reviewer to print the define.pdf for a hardcopy review.   
In addition to the above three major features of a define.pdf file, hierarchical bookmarks can help 
a viewer to navigate within the document efficiently.  There are essential elements in hard copy 
review, such as header and/or footer information, page numbering, and formatting of the contents 
within the printable space. 
Figure 1 shows an image of a page from a define.pdf document.  In the image, bookmarks and 
hyperlinks are clearly shown.  There are bookmarks for study information, annotated case report 
forms (aCRFs), supplemental documents, dataset metadata for each specific dataset, variable-
level metadata, and specific value-level information.  A dataset metadata table is displayed on 
the right hand side.  There are two hyperlinks (in blue underline font) for each dataset.  The 
hyperlink in the description column is connected to the define.pdf page for that dataset.  The 
hyperlink in the location column is connected to the actual dataset outside the define.pdf 
document.  For a more detailed example of the define.rtf document, please see Appendix A. 
C# PDF Convert: How to Convert Jpeg, Png, Bmp, & Gif Raster Images
Success"); break; case ConvertResult.FILE_TYPE_UNSUPPORT: Console.WriteLine("Fail: can not convert to PDF, file type unsupport"); break; case ConvertResult
pdf link to specific page; break a pdf password
C# Image Convert: How to Convert Word to Jpeg, Png, Bmp, and Gif
RasterEdge.XDoc.PDF.dll. FileType.IMG_JPEG); switch (result) { case ConvertResult. NO_ERROR: Console.WriteLine("Success"); break; case ConvertResult
acrobat split pdf; c# print pdf to specific printer
Page 3 of 36 
Figure 1  
Sample Define.pdf (from ODS RTF) with Bookmarks and Hyperlinks. 
Why Use ODS RTF Instead of ODS PDF 
It would would be more straightforward if we could create a satisfactory define.pdf directly 
using SAS
®
ODS PDF.  Figure 2 shows a document created using ODS PDF.  We have found 
that ODS PDF can 
• Generate define.xml content similar to that from ODS RTF  
• Create hyperlinks, although lacking some desired features 
• Create bookmarks, although lacking some desired features 
• Generate reasonable header/ footer information  
• Format acceptable contents 
With ODS PDF, the document hyperlinks by default have a blue box around the link’s display 
text.  Using a SAS style, we can change the link color to be black, and change the color of the 
display text to blue with an underline.  This gives the appearance of the text as a conventional 
browser hyperlink.  The reality is that the link is the entire cell of the table.  This also has the 
unintended effect of displaying thicker lines for the cells which contain links. 
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
Forms. Support adding PDF page number. Offer PDF page break inserting function. Free SDK library for Visual Studio .NET. Independent
break apart pdf; break apart pdf pages
C# PDF Page Insert Library: insert pages into PDF file in C#.net
Ability to add PDF page number in preview. Offer PDF page break inserting function. Free components and online source codes for .NET framework 2.0+.
can print pdf no pages selected; pdf split pages
Page 4 of 36 
With the ODS PDF, we are able to suppress the extra two levels generated with the PROC 
REPORT, but we were not able to make the bookmarks hierarchical.  In contrast to ODS RTF, 
we were unable to create multiple levels of bookmarks, i.e.,  insert a bookmark for the “Value 
Level Metadata” section, then insert an indented bookmark for each value-list within that 
section.  
Figure 2 
Sample Define.pdf (from ODS PDF) with Bookmarks and Hyperlinks. 
Here is a summary table that compares the define.pdf files that generated using ODS PDF and 
ODS RTF. 
Features of define.pdf 
ODS 
PDF 
ODS 
RTF 
Contents of the define.xml 
 
 
Hierarchical hyperlinks 
 
Bookmarks (blue underline text) 
 
Header/ footer information 
 
Page number 
 
 
In order to generate a define.pdf with the features described in the previous section, and to have 
better control of the format of contents, using ODS RTF is a better choice than ODS PDF.  There 
C# TWAIN - Query & Set Device Abilities in C#
device.TwainTransferMode = method; break; } if (method == TwainTransferMethod.TWSX_FILE) device.TransferMethod = method; } // If it's not supported tell stop.
break pdf into single pages; break a pdf
C# TWAIN - Install, Deploy and Distribute XImage.Twain Control
RasterEdge.XDoc.PDF.dll. device.TwainTransferMode = method; break; } if (method == TwainTransferMethod.TWSX_FILE) device.TransferMethod = method; } // If it's
pdf format specification; pdf split and merge
Page 5 of 36 
are other ways to generate a define.pdf.  One example is to create a postscript file first.  We 
decided to create define.rtf first then use Acrobat’s PDF Maker to convert the RTF file to PDF. 
Creating a User-Defined Style with PROC TEMPLATE 
Using PROC TEMPLATE, a user-defined style can be created for a RTF output file.  Here is a 
list of style elements that are used in a define.rtf document.   
1) Set margins, font style, and font size of a document 
2) Set borders, border width, cell padding, and cell space for a table 
3) Set background color for the header row of a table 
4) Set “pretext” and user text cell width and center justification 
5) Set system footer to use RTF codes 
Using the following SAS
®
PROC TEMPLATE code segments, a user can set the desired 
borders, define the font style, specify table style with a complete grid, assign the border spacing 
and cell spacing, as well as indicate the background color of the header row in a table.  In 
addition, a user may specify styles for printed text before a procedure (“pretext”) or user-defined 
text.  Furthermore, a user may allow RTF codes to be rendered in the system footer.  Here is the 
SAS
®
code segment used to generate a define.rtf output.  The comments within the SAS code 
further explain the purposes. 
proc template; 
define style Styles.RtfMod; 
parent = styles.rtf; 
/* 1) set the margins to 1 inch all around */ 
style Body from Body 
"Controls the Body file." / 
marginbottom = 1in  /* bottom margin */ 
margintop = 1in     /* top margin */ 
marginright = 1in   /* right margin */ 
marginleft = 1in   /* left margin */ 
;... 
/* set Font and size for system titles and footers */ 
'TitleFont2' = ("Times New Roman, <serif>", 11pt, bold)     
/* Font and size for system titles and footers */ 
'TitleFont' = ("Times New Roman, <serif>",13pt, bold)      
/* Font and size for system titles and footers */ 
'StrongFont' = ("Times New Roman, <serif>", 11pt, bold)     
/* Font and size for row header */ 
'headingEmphasisFont' = ("Times New Roman, <serif>", 11pt, bold)  
/* Font and size for text from compute block */ 
'headingFont' = ("Times New Roman, <serif>", 11pt, bold)          
/* Font and size for column header */ 
'docFont' = ("Times New Roman, <serif>", 10pt)                  
/* Font and size for data value in tables */   
;... 
/* 2) set table with rule and updated cell padding */ 
style table from output / 
rules = all 
frame = box          /* table frame */ 
C# TWAIN - Specify Size and Location to Scan
foreach (TwainStaticFrameSizeType frame in frames) { if (frame == TwainStaticFrameSizeType.LetterUS) { this.device.FrameSize = frame; break; } } }.
break up pdf into individual pages; break pdf into separate pages
C# TWAIN - Acquire or Save Image to File
RasterEdge.XDoc.PDF.dll. if (device.Compression != TwainCompressionMode.Group4) device.Compression = TwainCompressionMode.Group3; break; } } acq.FileTranfer
how to split pdf file by pages; break a pdf file into parts
Page 6 of 36 
borderwidth = 1pt    /* table border */ 
borderspacing = 1pt 
bordercolor = black 
background = white 
cellpadding = 2pt 
cellspacing = 1pt    /* gridline of table cells.  Default=0 pt makes lines */ 
/* inside lines of the table about 1/2 pt */ 
/* 3) set background color for the header row of the table */ 
style color_list from color_list 
"Colors used in the default style" / 
'link' = blue    /* hyperlink color */ 
'bgH' = skyblue  /* background color for header. Was white by default */ 
'fg' = black     /* foreground color */ 
'bg' = white     /* background color */... 
/* 4) set pretext and user text cell width and center justified ***/ 
class prepage /  
cellwidth=5in     
just=center 
style UserText from Note/ 
cellwidth=5in     
/* to avoid text wrap, provide ample space (5 in) for ods rtf text */ 
just=center 
/* 5) set system footer to allow RTF code ***/ 
class systemfooter / 
protectspecialchars=off 
End; 
Run; 
Using RTF Code to Generate Headings and Lines 
In order to control the styles of a define.rtf document, RTF codes are used to enhance the 
features, such as line, headings, and keep with next text line.  To make sure SAS recognizes the 
RTF code, the SAS ODS escapechar = statement is used.  A set of SAS
®
macro variables is 
created to store those commonly-used RTF codes for the RTF output.  SAS
®
recognizes any text 
string with single quote after ^R/RTF as a rich text format code.  Here are examples of setting up 
SAS
®
macro variables that contain RTF codes.  Comments are used to explain the meanings of 
the RTF codes. 
ods escapechar='^'; 
%let line=^R/RTF'\brdrb\brdrs\brdrw10\brsp20'; /* add a line */ 
%let head1=^R/RTF'\s1\fs26\b\qc ';            /* Style 1, size=13pt, bold, center */ 
%let head2=^R/RTF'\s2\fs24\b\qc ';            /* Style 2, size=12pt, bold, center */ 
%let head22=^R/RTF'\s2\fs24\b\qc\page '; 
/* Style 2, size=12pt, bold, center, page break */ 
... 
%let keepn=^R/RTF'\keepn ';         /* keep with next */ 
%let heading4=%str({\s1 Heading 1;\s2 Heading 2;\s3 Heading 3;\s4 Heading 4;}); 
/* define four headings in the RTF document as Styles 1 to 4 */ 
Page 7 of 36 
The line macro variable (see above SAS
®
code example) is used to add lines under the header for 
study names and above the page x of y in the footer.  The head1 and head2 macro variables are 
used to add the RTF codes to define different heading styles.  These heading styles are used for 
creating bookmarks in the PDF output.  The head1 macro variable defines style 1 (s1) as having 
the following characteristics: font size of 13pt (\fs26), bold (\b), and centered (\qc).  See 
Appendix B for additional RTF codes. 
To improve the visual effect of the tables, the keepn macro variable is used to add RTF codes to 
the first row and the next-to-last row of each table in order to avoid orphan rows.  By adding the 
keepn macro variable to the first row of a table, the table will keep the following row on the same 
page as the first row.  This keeps a table from starting at the bottom of a page with only one row 
before going to the next page.  In addition, adding the keepn macro to the next-to-last row will 
prevent the last row of a table from starting a new page.   
The following SAS
®
code puts the above-mentioned macro variables to use in a RTF output. 
data study; 
set &UserDataLibname..study; 
length stdytitle $200; 
stdytitle="&head2.Study Information"; 
call symput ('study',trim(studyname)); 
call symput ('std',trim(StandardName)); 
call symput ('stdv',trim(StandardVersion)); 
run; 
%put study = &study; 
... 
title1 h=10pt j=l "Study &study.&line" j=r "&docver.&line"; 
footnote1 h=10pt j=c "&line" ; 
footnote2 h=10pt j=r "Page ^{pageof}"; 
ods rtf Text = "&head1.Study &study"; 
ods rtf prepage = "&head2.Study^\~Information"; 
proc report data = study nowd split='~' ; 
column   StudyName StudyDescription ; 
define StudyName          / display "Study Name" 
style(column)=[cellwidth=2in just=left]; 
define StudyDescription   / display "Study Description" 
style(column)=[cellwidth=6.5in just=left]; 
run; 
Generating Bookmarks, Hyperlinks, and Special Effects 
Key features of the define.pdf are bookmarks and hyperlinks.  They allow the reviewer to 
quickly navigate to the desired data.  SAS
®
automatically creates bookmarks as each output table 
is created, called IDX, IDX1 through IDX<n>.  These SAS-generated bookmarks are used to 
create hyperlinks for each dataset description within the RTF document.  The RTF code “\\l” is 
used to indicate that the hyperlink is a local bookmark.  The starting number of the IDX will 
depend on the number of output tables generated before the dataset variable-level description 
tables.  The macro variable _indx contains the count of tables prior to the dataset variable-level 
Heading 2: Study Information 
Header Information with a line 
Page number below a line in footer 
Heading 1: Study Name and Number 
Page 8 of 36 
description tables, and is added to the macro variable DatasetOrder to give the correct IDX 
bookmark number to the hyperlink.  The RTF code for the character style (\cs15), blue color 
(\cf2), and underline (\ul) is used to display the hyperlink. 
The location of the SAS
®
xpt file is created with the RTF code “\\”, without the l, as it is not a 
local bookmark.  The location macro variable is used to create a relative link to the SAS
®
xpt 
file.  Here is a sample SAS® code for generating bookmarks and hyperlinks: 
... 
/* Adding hyperlink dataset titles using SAS automatically generated 
bookmarks IDXn in the same document - Dataset Order is very important */ 
/* There are 3 tables for SDTM data +3 (=&_indx), 2 for ADaM data +2 */ 
titleh = '{\field\*{\*\fldinst\*HYPERLINK\*\\l\*' || 
'IDX' || compress(put(DatasetOrder+%eval(&_indx),f8.)) ||  
'}{\fldrslt\*{\cs15\cf2\ul\*' || trim(left(title)) || '}}}'; 
folder as the define.pdf */ 
locationh = '{\field\*{\*\fldinst\*HYPERLINK\*"\\'  || 
compress(location) ||   
'"}{\fldrslt\*{\cs15\cf2\ul\*' || compress(location) || '}}}'; 
... 
Additional hyperlinks are needed for links to additional data, such as value-level metadata tables, 
computational algorithms, and code lists.  To create these hyperlinks, a bookmark is created 
using the \bkmkstart and \bkmkend RTF code.  The bookmark name is formed by adding a “BK” 
string to the name of the desired location. 
The following is an example of adding bookmarks to the computational method reference: 
... 
/* Identify the variables with computational method */ 
nodupkeys; 
by dataset variable; 
where ComputationMethod^=' '; 
run; 
data varcomp; 
set varcomp; 
by dataset variable; 
length compoid $40 compoidb $200; 
compoid='COMP'||put(_n_,z4.); 
/**** {\field {\*\fldinst HYPERLINK "filename_and_path"} 
{\fldrslt display_text}} ****/ 
comment = trim(left(comment))||' See Computational Method: ' 
||"^R/RTF'{\field {\*\fldinst HYPERLINK \\l " || 
'BK' || compress(compoid) || '}{\fldrslt {\cs15\cf2\ul ' 
|| trim(left(compoid)) || '}}}'; 
/*** add bookmarks to the computational method reference number ***/ 
/***{\*\bkmkstart bookmark_name}display_text 
{\*\bkmkend bookmark_name}****/  
compoidb="&head4"||'{\*\bkmkstart BK' || compress(compoid) || 
'}' || compress(compoid)||'{\*\bkmkend BK'||compress(compoid)||'}'; 
Page 9 of 36 
/*** count the total number of computational methods ***/ 
%let ncomp=0; 
if _n_>0 then call symput ('ncomp',compress(put(_n_,4.))); 
run; 
Figure 3, shows the define.pdf image after it is converted from the define.rtf generated by the 
above SAS code. 
Figure 3 
Sample output with bookmarks and local hyperlinks (from SAS code above) 
Putting define.rtf Together with ODS RTF and PROC REPORT Statements  
Using multiple PROC REPORT procedures, we generated a complete RTF output.  A 
COMPUTE statement in PROC REPORT is used to generate variable-level metadata for each 
dataset.  The heading of the table contains the dataset name (left justified) and a link for the SAS 
transport (xpt) file (right justified).  To have these two variables justified on opposite ends of the 
line, a right-justification tab is inserted using the RTF code \tqr\tx12550.  This code inserts a tab 
at 8.7 inches which right justifies any text after the tab character. Inserting the RTF \tab code, a 
tab after the dataset name right justifies the xpt file name after the tab.  In order to suppress 
trailing spaces in the dataset name, the Datasetb variable is printed with the $varying100. format. 
Page 10 of 36 
ods rtf prepage = "&&&dst&i"; 
proc report data = &_indat nowd split='~'; 
where dataset="&&&ds&i"; 
column DatasetOrder datasetb locationh variable 
label datatype codelisth origin comment ; 
define DatasetOrder  / order order=internal noprint; 
define Datasetb      / order order=internal noprint; 
define locationh     / order order=internal noprint; 
define variableh     / display "Variable" 
style(column)=[cellwidth=1in just=left]; 
define label         / display "Label" 
style(column)=[cellwidth=1.5in just=left]; 
define datatype      / display "Type" 
style(column)=[cellwidth=0.5in just=left]; 
define codelisth     / display "Controlled~Terminology" 
style(column)=[cellwidth=1in just=left]; 
define origin        / display "Origin" 
style(column)=[cellwidth=1.5in just=left]; 
define comment       / display "Comment" 
style(column)=[cellwidth=3.25in just=left];  
break after datasetb / page; 
compute before _page_ /style = [protectspecialchars = off 
background=cxc6dbf1 just=left]; 
dslen = lengthn(Datasetb); 
line @1 ‘\tqr\tx12550’ Datasetb $varying100. dslen ‘\tab’ 
locationh $100.; 
endcomp; 
run; 
Discussion 
Once the RTF output is generated, we use Adobe Acrobat Pro PDF Maker to convert it to a 
define.pdf document from Microsoft Word 2007, which is a reader of rich text format files.  
Handshakes between Microsoft Word and Acrobat should be carefully examined.  For example, 
in define.xml a hyperlink to a specific page within an external PDF file contains a URL such as 
“blankcrf.pdf#21”, where #21 is a pdf “named destination” for Page 21 in the blankcrf.pdf file.  
Using SAS, a user can create a hyperlink with this URL, but when the RTF file is converted into 
PDF, the “#21” part is ignored during the PDF conversion and the hyperlink will reference the 
entire document and only open the first (or most recently accessed) page, not the intended page.  
In conclusion, we were able to generate a robust define.rtf from the define.xml contents with 
bookmarks, hyperlinks, and proper pagination by using SAS
®
ODS RTF.  The sample define.pdf 
in Appendix A was generated in SAS
®
version 9.3.  The same define.pdf document was 
generated from SAS
®
version 9.2 (TS2M2) using the same program code. 
Documents you may be interested
Documents you may be interested