【问题标题】:Use image in a SAS Stored Process's HTML Stream在 SAS 存储过程的 HTML 流中使用图像
【发布时间】:2016-01-09 16:34:34
【问题描述】:

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

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

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

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

我卡住了,如何在这里使用自定义图像?

【问题讨论】:

  • 第二个要点,您是说在 Web/staging/*** 中有两个不同的图像文件,一个可以工作,另一个不行?如果是这样,我会检查文件的权限以使您的文件可读。
  • 解锁第二张图片...所有用户都有读取权限..没有影响

标签: image sas sas-stored-process


【解决方案1】:

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

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

<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 很简单。您可以简单地在 Google 上搜索“在线 base64 图像转换器”,例如 this one。拖放您的图像,它会为您生成 base64 代码。

要将其放入 sas 中的数据步中,只需以下情况:

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

如果您的图像特别大(例如大于 ~32k),您可能会在尝试从数据步输出图像时遇到问题。我可能需要对此进行测试以澄清。您可以通过从 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;

这是我用来测试的图片:

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

iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABaSURBVDhP5YxbCsAgDAS9/6XTvJTWNUSIX3ZAYXcdGxW4QW6Khw42Axne81LG0shlRvVVLyeTI2aZ2fcPyXwPdBI8B999NK/gKTaGyxaMX8gTJRkpyREFmegBTt8lFJjOey0AAAAASUVORK5CYII=

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


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

另请参阅 Don Henderson 的 this post,它提供了解决此问题的类似方法。感谢 Vasilij 提供的链接。

【讨论】:

  • 可能是IE版本的原因,在我的本地浏览器上运行良好
  • 好点。以下是支持它的浏览器列表:stackoverflow.com/questions/1207190/embedding-base64-images
  • 猜猜看...这行得通...结果 put 语句只能保存 x 字节,否则它们会搞砸...只是质量不是 100% 的另一件事。那是怎么回事..
  • 如果您想将文件转换为 SAS 中的 Base64,请参阅此博客文章:hcsbi.blogspot.co.uk/2013/01/… 也可以在此处下载宏 sascommunity.org/wiki/File:Base64_getImage_Tool.zip
  • @Moon 使用put _infile_ 方法应该可以避免您在使用 put 语句时遇到的拖拽问题。此外,图像质量不应受到任何影响,我不确定您为什么会看到这种情况。
【解决方案2】:

当您在 SAS 元数据中定义图片时,可以通过 SAS 内容服务器对其进行访问。 要获取图片 URL,请登录:“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(Report)' 访问它

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

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

【讨论】:

【解决方案3】:

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

由于该报告仅适用于内部受众,因此他们都可以访问 Intranet,但不一定可以访问 Content Server,因此它规避了 Bagin 提到的问题。

如果您没有合适的 Intranet,您始终可以从您的公共网站引用一个徽标,该徽标可能可供所有观众使用,即使他们是外部观众,但您无法控制该徽标文件有一天它可能会以某种不受欢迎的方式发生变化。

问候, 瓦西里

【讨论】:

  • 是的,这可以工作,但这不是正确的做法。
【解决方案4】:

使用SASjs,您可以将任何二进制内容编译成 SAS Web 服务(存储过程或 Viya 作业)。

这是一个使用 MP3 文件的示例:https://github.com/allanbowe/sasrap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多