Hi everyone,
I'm producing a report in pdf concatenating PROC REPORT procedures and depending on the resulting table width I'm turning the page to landscape or back to portrait as needed. Each table starts in a new page.
I'm starting with portrait orientation and everything looks fine: the produced table fits the page width (I'm using style(report)={width=100%} in the PROC REPORT) and the defined footnote appears where it should as well as a header preimage defined in the template I'm using. However, when I change to landscape the table is truncated on the right and the footnote dissapears. Everything points out to an issue with the definition of the landscape page parameters but I can't figure out where is the problem.
Moreover, once I have turned to landscape the first time, all the following portrait-oriented pages get messy too while if I comment the landscape parts every portrait page is outputed nicely.
I'm attaching here an example of my code but please tell me if you think that any other part could be interesting to detect the issue:
* Open ODS to create Patient Profile report (portrait);
options orientation=portrait nodate nonumber papersize=A4;
goptions reset=goptions device=sasemf target=sasemf xmax=7.5in ymax=10in;
ods pdf dpi=700 style=template_portrait file="&outputpath/Patient Profile report - &patID (&sysdate).pdf" pdftoc=1;
* Remove residual titles and define footnote;
title;
footnote;
title ' '; * this is needed for the logo image to appear;
ods escapechar='~';
footnote j=l h=1.75 "&studyname" j=r h=1.75 "Page ~{thispage}";
*----------------------------------------------------------------------------;
* DEMOGRAPHICS ;
*----------------------------------------------------------------------------;
proc report data=_auxdemo nowd headline style(header)={background=very light grey fontsize=8pt} missing style(column)={fontsize=8pt} style(report)={width=100%};
column ("Demographics of patient &patID." siteid gender age cmdecod);
define siteid / display 'Site' flow;
define gender / display 'Gender' flow;
define age / display 'Age (years)' flow;
define cmdecod / display 'Previous immunotherapy' flow;
run;
*----------------------------------------------------------------------------;
* VITAL SIGNS PER VISIT ;
*----------------------------------------------------------------------------;
* Turn to landscape;
options orientation=landscape nodate nonumber papersize=A4;
goptions reset=goptions device=sasemf target=sasemf xmax=10in ymax=7.5in;
ods pdf style=template_landscape;
proc report data=_auxvs nowd headline style(header)={background=very light grey fontsize=8pt} missing style(column)={fontsize=8pt} style(report)={width=100%};
column ("Vital signs per visit of patient &patID." visit vsdat sysbp vsgyn1 vsgchr1);
define visit / display 'Visit' flow;
define vsdat / display 'Vitals Date' flow;
define sysbp / display 'Value (mmHg)' flow;
define vsgyn1 / display 'Clin. sig.?' flow;
define vsgchr1 / display 'Specify' flow;
run;
* Go back to portrait orientation;
options orientation=portrait nodate nonumber papersize=A4;
goptions reset=goptions device=sasemf target=sasemf xmax=7.5in ymax=10in;
ods pdf style=template_portrait;
*----------------------------------------------------------------------------;
* END OF STUDY REASONS ;
*----------------------------------------------------------------------------;
proc report data=_auxeos nowd headline style(header)={background=very light grey fontsize=8pt} missing style(column)={fontsize=8pt} style(report)={width=100%};
column ("End of study reason of patient &patID." dsdat3 dsstdat dsglst1 dsglst2);
define dsdat3 / display 'Date of last contact with subject' flow;
define dsstdat / display 'Date of last dose in the study' flow;
define dsglst1 / display 'EOS status' flow;
define dsglst2 / display 'Reason for screening failure or discontinuation' flow;
run;
ods pdf close;
Here you have the two style templates that I'm using. They are the same except for the preimage which is different depending on the orientation.
/* Portrait template */
proc template;
define style template_portrait;
parent = styles.default;
style Body from Document
"Controls the Body file." /
marginbottom = 2cm
margintop = 2cm
marginright = 2cm
marginleft = 2cm;
style fonts /
'TitleFont2' = ("Arial",10pt,Italic)
'TitleFont' = ("Arial",10pt,Italic)
'StrongFont' = ("Arial",9pt,Bold)
'EmphasisFont' = ("Arial",9pt,Italic)
'FixedEmphasisFont' = ("Arial, Courier",8pt,Italic)
'FixedStrongFont' = ("Courier New, Courier",8pt,Bold)
'FixedHeadingFont' = ("Courier New, Courier",8pt,Bold)
'BatchFixedFont' = ("SAS Monospace, Arial",8pt)
'FixedFont' = ("Arial",8pt)
'headingEmphasisFont' = ("Arial",8pt,Bold Italic)
'headingFont' = ("Arial",8pt,Bold)
'docFont' = ("Arial",8pt);
style titleAndNoteContainer from titleAndNoteContainer /
width = _undef_;
style cell from container /
linkcolor = colors('link2');
style table from table /
padding = 3pt;
style Table from Output /
rules = rows
frame = hsides
bordercolor = CX27323F;
style batch from batch /
rules = none
frame = void
padding = 0pt
borderspacing = 0pt;
style Byline from Byline
"Controls byline text." /
frame = void;
style color_list /
'contentfg' = cx000000
'contentbg' = cxFFFFFF
'fgB2' = CX27323F
'fgB1' = CX27323F
'fgA4' = CX27323F
'bgA4' = cxFFFFFF
'bgA3' = cxFFFFFF
'fgA2' = CX27323F
'bgA2' = cxFFFFFF
'fgA1' = CX27323F
'bgA1' = cxFFFFFF
'fgA' = CX27323F
'bgA' = cxFFFFFF;
style GraphBox from GraphBox /
displayopts = "fill caps median mean outliers";
style GraphHistogram from GraphHistogram /
displayopts = "fill outline";
style GraphEllipse from GraphEllipse /
displayopts = "outline";
style GraphBand from GraphBand /
displayopts = "fill";
class cell /
textalign=center;
class header /
textalign=center;
style systemtitle /
textalign=l
verticalalign=t
preimage="C:\mypath\Logo_portrait.png" foreground = #ffffff;
end;
run;
/* Landscape template */
proc template;
define style template_landscape;
parent = styles.default;
style Body from Document
"Controls the Body file." /
marginbottom = 2cm
margintop = 2cm
marginright = 2cm
marginleft = 2cm;
style fonts /
'TitleFont2' = ("Arial",10pt,Italic)
'TitleFont' = ("Arial",10pt,Italic)
'StrongFont' = ("Arial",9pt,Bold)
'EmphasisFont' = ("Arial",9pt,Italic)
'FixedEmphasisFont' = ("Arial, Courier",8pt,Italic)
'FixedStrongFont' = ("Courier New, Courier",8pt,Bold)
'FixedHeadingFont' = ("Courier New, Courier",8pt,Bold)
'BatchFixedFont' = ("SAS Monospace, Arial",8pt)
'FixedFont' = ("Arial",8pt)
'headingEmphasisFont' = ("Arial",8pt,Bold Italic)
'headingFont' = ("Arial",8pt,Bold)
'docFont' = ("Arial",8pt);
style titleAndNoteContainer from titleAndNoteContainer /
width = _undef_;
style cell from container /
linkcolor = colors('link2');
style table from table /
padding = 3pt;
style Table from Output /
rules = rows
frame = hsides
bordercolor = CX27323F;
style batch from batch /
rules = none
frame = void
padding = 0pt
borderspacing = 0pt;
style Byline from Byline
"Controls byline text." /
frame = void;
style color_list /
'contentfg' = cx000000
'contentbg' = cxFFFFFF
'fgB2' = CX27323F
'fgB1' = CX27323F
'fgA4' = CX27323F
'bgA4' = cxFFFFFF
'bgA3' = cxFFFFFF
'fgA2' = CX27323F
'bgA2' = cxFFFFFF
'fgA1' = CX27323F
'bgA1' = cxFFFFFF
'fgA' = CX27323F
'bgA' = cxFFFFFF;
style GraphBox from GraphBox /
displayopts = "fill caps median mean outliers";
style GraphHistogram from GraphHistogram /
displayopts = "fill outline";
style GraphEllipse from GraphEllipse /
displayopts = "outline";
style GraphBand from GraphBand /
displayopts = "fill";
class cell /
textalign=center;
class header /
textalign=center;
style systemtitle /
textalign=l
verticalalign=t
preimage="C:\mypath\Logo_landscape.png"
foreground = #ffffff;
end;
run;
Here you have an example of the output where you can clearly see the problem:
Any tips or suggestions are very much appreciated!
Thanks a lot in advance.
This won't be very helpful I am afraid, but I have always had issues going directly to PDF. My preference is to create one output per block. I create RTF output then combine in Acrobat, but you could produce each one separately to PDF, then combine them all. I find this gives more control over the whole document, and you can chop and change if needed.
Thank you for your quick response @RW9.
This could be an option but it will require a postprocessing step that I'm trying to avoid. I believe that there must an option that enables me to create the pdf as a whole...
Thanks anyway for your help.
Hi @Cynthia_sas,
I tried your sugesstion and everything works fine without the style definition in the ods statement, so I was wondering if it was an specific part of the template code that was making everything crash and I found it: the margin definition.
style Body from Document
"Controls the Body file." /
marginbottom = 2cm
margintop = 2cm
marginright = 2cm
marginleft = 2cm;
If I remove this part (which is the same for both templates portrait and landscape, that's why I didn't think of it at first) from the templates that I posted before the tables are not truncated anymore. Do you see something strange in this definition? Any idea of what is happening or how could I define the margins in a different way?
Thanks again for your help!
Thanks for your help @Cynthia_sas, I'll talk to Tech Support.
In case it's useful for someone I finally managed to solve it moving the margin size definition from the PROC TEMPLATE to the options statement:
options orientation=portrait nodate nonumber leftmargin=2cm rightmargin=2cm topmargin=2cm bottommargin=2cm papersize=A4;
I also removed the goptions sentences (I may have inherited them from another code containing graphs) as @Cynthia_sas suggested as they didn't have any purpose on this code.
Hope this helps!
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.