如何在SAS RTF输出中调整导入的PNG文件的大小?

时间:2015-11-10 21:50:48

标签: sas sas-ods

对问题Is it possible to import a PNG file into SAS to include in RTF output?的回答提供了一种在SAS ODS RTF输出中使用外部PNG文件的方法。为了使提供的解决方案起作用,它需要文本跟随图像文件的插入。即使我没有跟随图像的文本,我曾经使其工作的一种方法是在图像之后插入下划线,该图像将在脚注之前具有底部边界;但是,这不符合为此项目创建的其他输出,因此我正在寻找一种导入保持基本格式的PNG的方法。

此外,我希望能够调整图像的显示尺寸。目前,我必须确保图像大小在创建时完全正确,以便它不会超出边框,但这会创建一个比我想要的更像素化的图像。我希望能够将它强制为SAS所需的大小,这样我在创建图像时可以在尺寸上有一定的灵活性,并在RTF文件中生成足够高质量的图像。

虽然这可能看起来像是单独的问题,但在我看来,一个问题的解决方案可能会解决这两个问题,如下所示。

以下是一些产生最小例子的代码:

/* Create test data */
data test;
  drop i;
  call streaminit(1579);
  do i = 1 to 200;
    u = rand("Normal");
    output;
  end;
run;

/* Create a PNG file to bring into the RTF -- the PNG will
   actually be created outside of SAS but is included here
   for convenience */
proc sgplot data=test;
  density u / type=kernel;
run;

/* Set options for RTF output */
option nodate nonumber;
ods rtf file = "test.rtf" nogtitle nogfoot
ods escapechar='~';

/* Titles and footnotes */
title 'Title';
/* Border line at the start of the footnote section */
footnote height=2pt '~R"\brdrb\brdrs\brdrw30';
footnote2 j=l 'Footnote';

/* Import the image and output into the RTF */
ods text='~S={preimage="SGPlot1.png"}';
ods rtf close;

上面的代码生成了一个如下所示的文档:

Wrong Output

身体中的细​​垂直线是图像。如果我将手柄向右拖动,则会显示完整图像。我希望能够创建以下代码的等效代码,而无需在SAS中创建图像:

/* Set options for RTF output */
option nodate nonumber;
ods rtf file = "test1.rtf" nogtitle nogfoot;
ods escapechar='~';

/* Titles and footnotes */
title 'Title';
/* Border line at the start of the footnote section */
footnote height=2pt '~R"\brdrb\brdrs\brdrw30';
footnote2 j=l 'Footnote';

ods graphics / height=9in width=7in;

/* Import the image and output into the RTF */
proc sgplot data=test;
  density u / type=kernel;
run;
ods rtf close;

此代码生成以下内容:

Desired Output

请注意,我放大了图像(SAS会在创建图像时自动调整像素等,但这不是必需的,因为已经创建了PNG文件)。另请注意,在生成RTF时实际显示图像,并且不需要任何后期处理。这可能吗?

1 个答案:

答案 0 :(得分:0)

经过一番调查后,我发现这个答案分为两部分。通过将width=100%添加到样式中,可以完全显示图像而不是没有宽度,如下所示:

ods text='~S={width=100% preimage="SGPlot1.png"}';

调整图像的尺寸有点麻烦,但可以通过以文本形式读取文件并将rtf控制字pichgoalNpicwgoalN替换为所需高度来完成和缇的宽度(缇是1/1440英寸)。我是这样做的:

data edit;
  infile "test.rtf" dlm='09'x dsd lrecl=32767 missover;
  format var $200. varout $200.;
  input var $;
  varout = prxchange("s/pichgoal\d+/pichgoal12960/",-1,var);
  varout = prxchange("s/picwgoal\d+/picwgoal10080/",-1,varout);
run;

data _null_ ;
  set edit ; 
  FILE 'test1.rtf';
  PUT varout; 
run ;