如何调整 SAS RTF 输出中导入的 PNG 文件的大小?
How can I adjust the size of an imported PNG file in SAS 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;
以上代码生成如下所示的文档:
正文中的那条细竖线就是图像。如果我将手柄向右拖动,则会显示完整图像。我希望能够创建与以下代码等效的代码,而无需在 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;
此代码生成以下内容:
注意我已经放大了图像(SAS 会在创建图像时自动调整像素等,但这不是必需的,因为 PNG 文件已经创建好了)。另请注意,图像实际上是在生成 RTF 时显示的,不需要任何 post 处理。这可能吗?
经过一番调查,我发现这个答案有两个部分。可以通过向样式添加 width=100%
来使图像完全显示而不是没有宽度,如下所示:
ods text='~S={width=100% preimage="SGPlot1.png"}';
调整图像的尺寸有点老套,但可以通过以文本形式读取文件并将 rtf 控制字 pichgoalN
和 picwgoalN
替换为以缇为单位的所需高度和宽度(缇为 1/1440 英寸)。这是我的做法:
data edit;
infile "test.rtf" dlm='09'x dsd lrecl=32767 missover;
format var 0. varout 0.;
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 ;
对问题
此外,我希望能够调整图像的显示大小。目前,我必须确保创建图像时图像大小完全正确,以免超出边界,但这会创建比我想要的像素化程度更高的图像。我希望能够强制它成为 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;
以上代码生成如下所示的文档:
正文中的那条细竖线就是图像。如果我将手柄向右拖动,则会显示完整图像。我希望能够创建与以下代码等效的代码,而无需在 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;
此代码生成以下内容:
注意我已经放大了图像(SAS 会在创建图像时自动调整像素等,但这不是必需的,因为 PNG 文件已经创建好了)。另请注意,图像实际上是在生成 RTF 时显示的,不需要任何 post 处理。这可能吗?
经过一番调查,我发现这个答案有两个部分。可以通过向样式添加 width=100%
来使图像完全显示而不是没有宽度,如下所示:
ods text='~S={width=100% preimage="SGPlot1.png"}';
调整图像的尺寸有点老套,但可以通过以文本形式读取文件并将 rtf 控制字 pichgoalN
和 picwgoalN
替换为以缇为单位的所需高度和宽度(缇为 1/1440 英寸)。这是我的做法:
data edit;
infile "test.rtf" dlm='09'x dsd lrecl=32767 missover;
format var 0. varout 0.;
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 ;