在SAS存储过程的HTML流

时间:2016-01-09 16:34:35

标签: image sas sas-stored-process

我正在使用SAS STP创建报告,我想在报告上显示图像(徽标)。好的,这就是发生的事情:

data _null_;
    file _webout;
    put '<html>';
    put '</html>';
run;

我正在使用HTML,因为我需要显示复杂的表格格式而且我没有使用%STPBEGIN&amp; %STPEND因为这会打开一个ODS流,坦率地说我不知道​​如何处理并且我遇到了问题。不使用%STPBEGIN表示上述代码。这对我来说是一个非常成功的机制。我可以用CSS和一切来展示漂亮的报告。唯一的问题是图像。客户最近要求在每份报告上加上标识。我虽然这很容易,但事实并非如此。好的,这是交易,我试图使用<img src=" "/ >标签,我想我会使用一些相对路径,我的图像将显示。这项技术成功并失败了。

  • 我使用SAS Management Console将图像添加到文件夹位置 并使用其相对路径'/ Products / SAS Enterprise GRC / ****'(不起作用)
  • 我将图像复制到Web / Staging / ***下的默认主题图像文件夹中,并尝试使用相对路径(不起作用)。所以我试图使用默认主题中的其他图像。它奏效了。

我被困住了,我怎么能在这里使用自定义图像?

3 个答案:

答案 0 :(得分:3)

如果您的图片是静态的,您可以使用datastep将其嵌入到结果中,而无需将文件复制到服务器。

这样做的诀窍是将图像编码为Base64编码,然后您可以使用这种神奇的符号将图像嵌入<img src="" />语句中:

<img src="data:image/png;base64,...." />

您可以看到src=属性包含元数据,告诉浏览器该值包含图像数据,表示png文件(我在测试此帖子时使用了png文件,您可能有JPG / BMP等...)并使用base64编码该值。最后的4个句点将替换为以base64表示法表示的图像数据。这看起来像这样:

<img src="data:image/png;base64,iVBORw0KGgoAAAAN ... much much more base64 content here ... HSLyz+h9xy+7HbHRL83L1tv9h8+4d/+Ic/Gf8DiYav3mpqHAMAAAAASUVORK5CYII=" />

将图像转换为base64非常简单。你可以简单地谷歌搜索一个&#34;在线base64图像转换器&#34;例如this one。拖放您的图片,它将为您生成base64代码。

要将其转换为sas中的datastep,它只是一个案例:

data _null_;
    file _webout;
    put '<html>';
    put '<img src="data:image/png;base64,iVBORw0KGgoAAAAN......etc..." />';
    put '</html>';
run;

如果图像特别大(比如大于〜32k),则可能会遇到尝试从datastep输出图像的问题。我可能需要对此进行测试以澄清。您可以通过从SAS中的文件中读取base64图像并使用类似于下面的代码将其直接流式传输到_webout来解决此问题:

data _null_;
  file _webout;
  infile '\path\to\base64\file.ext';
  input;
  put _infile_;
run;

如果你想变得非常棘手,你可以拍摄你喜欢的任何图像(例如在SAS中生成的图表)并将其转换为base64,然后将其流出。以下是一些SAS代码,它将采用图像文件并将其转换为Base64:

data _null_;
  length base64_format $20 base64_string $32767;

  infile "\your_sasdir\hi.png" recfm=n;
  file "\your_sasdir\hi.base64";
  input byte $16000. ;

  * FORMAT LENGTH NEEDS TO BE 4n/3 ROUNDED UP TO NEAREST MULTIPLE OF 4;
  format_length = 4*(lengthn(byte)/3);
  mod = mod(format_length,4);
  if mod ne 0 then do;
    format_length = format_length - mod + 4;
  end;
  base64_format = cats("$base64x",format_length,".");

  base64_string = putc(cats(byte), base64_format);
  put base64_string;
run;

这是我用来测试它的图像:

enter image description here

转换后,Base64表示应如下所示:

iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABaSURBVDhP5YxbCsAgDAS9/6XTvJTWNUSIX3ZAYXcdGxW4QW6Khw42Axne81LG0shlRvVVLyeTI2aZ2fcPyXwPdBI8B999NK/gKTaGyxaMX8gTJRkpyREFmegBTt8lFJjOey0AAAAASUVORK5CYII=

我想看看我是否能找到一种简化方法,因为这是我们经常在工作中做的事情。

编辑:有趣的是,SAS9.4似乎支持使用ODS HTML5inline选项直接执行此操作。请参阅文档here

参见Don Henderson的this post,它提供了一种类似的方法来解决这个问题。感谢Vasilij的链接。

答案 1 :(得分:0)

在SAS元数据中定义图片时,可以通过SAS Content服务器访问它。 要获取图片网址,请登录:“https://severhost/SASContentServer/repository/default/sasfolders”并搜索您的图片。

如果您在目录/ Products / SAS Enterprise GRC / PictureName.gif中定义了您的图片,则可以从adres'https://severhost/SASContentServer/repository/default/sasfolders/Products/SAS Enterprise GRC / PictureName.gif(报告)'

访问该图片。

当然,您必须记住,客户用户需要具有SAS元数据中的访问权限才能读取图片对象。

如果这不能解决您的问题,请输入您正在使用的SAS软件版本。

答案 2 :(得分:0)

我曾经遇到过类似的问题。我已将图像添加到我们的Intranet,当时恰好是SharePoint。我将该图像定义为具有公共访问级别,然后在我的所有报告中引用。

由于报告仅针对内部受众,因此他们都可以访问Intranet,但不一定能访问Content Server,因此它可以避免Bagin提到的问题。

如果您没有合适的内部网,您可以随时在公共网站上引用一个徽标,该徽标可能对所有受众群体都可用,即使它们是外部的,但是您无法控制该徽标文件有一天,它可能以某种不受欢迎的方式改变。

此致 Vasilij

相关问题