在 SAS 存储过程的 HTML 流中使用图像
Use image in a SAS Stored Process's HTML Stream
我正在使用 SAS STP 创建报表,我想在报表上显示图像(徽标)。好的,这是正在发生的事情:
data _null_;
file _webout;
put '<html>';
put '</html>';
run;
我正在使用 HTML,因为我需要显示复杂的 table 格式,但我没有使用 %STPBEGIN
和 %STPEND
,因为这会打开 ODS坦率地说,我不知道如何处理流,我遇到了问题。不使用 %STPBEGIN
表示上面的代码。这对我来说是一个非常成功的机制。我可以用 CSS 和一切来展示漂亮的报告。唯一的问题是图像。一位客户最近要求在每份报告上贴上徽标。我虽然这很容易,但事实并非如此。好的,这就是交易,我尝试使用 <img src=" "/ >
标签,我想我会使用一些相对路径,我的图像就会显示出来。这项技术成功了,也失败了。
- 我使用 SAS 管理控制台将图像添加到文件夹位置
并使用其相对路径“/Products/SAS Enterprise GRC/****”(无效)
- 我将一张图片复制到 Web/Staging/*** 下默认主题的图片文件夹,并尝试使用相对路径(没有用)。所以我尝试使用默认主题中的其他图像。成功了。
我卡住了,如何在这里使用自定义图像?
当您在 SAS 元数据中定义图片时,可以通过 SAS 内容服务器访问它。
要获取图片 URL,请登录:“https://severhost/SASContentServer/repository/default/sasfolders”并搜索您的图片。
如果您在目录 /Products/SAS Enterprise GRC/PictureName.gif 中定义了图片,应该可以从地址“https://severhost/SASContentServer/repository/default/sasfolders/Products/SAS Enterprise GRC/PictureName.gif(Report)”访问它
当然你要记住,客户用户需要在 SAS 元数据中具有访问权限才能读取图片对象。
如果这不能解决您的问题,请输入您使用的 SAS 软件版本。
我遇到过和你类似的问题。我已将图像添加到我们的 Intranet,当时恰好是 SharePoint。我将该图像定义为具有 public 访问级别,然后在我的所有报告中进行引用。
由于报告仅供内部观众使用,他们都可以访问内联网,但不一定可以访问内容服务器,因此可以避免 Bagin 提到的问题。
如果您没有合适的内联网,您总是可以从您的 public 网站引用一个徽标,该徽标可能可供所有受众使用,即使他们是外部受众,但您没有控制该徽标文件,有一天它可能会以某种不受欢迎的方式发生变化。
此致,
瓦西里
如果您的图像是静态的,您可以使用数据步将其嵌入到结果中,而无需将文件复制到服务器。
这样做的技巧是将图像编码为 Base64 编码,然后您可以使用这个神奇的符号将图像嵌入到 <img src="" />
语句中:
<img src="data:image/png;base64,...." />
你可以看到 src=
属性包含元数据来告诉浏览器该值包含图像数据,代表一个 png 文件(我在测试这个 post 时使用了一个 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 很简单。对于 "online base64 image converter",例如 this one,您可以简单地 google。拖放您的图片,它会为您生成 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 base64_string 767;
infile "\your_sasdir\hi.png" recfm=n;
file "\your_sasdir\hi.base64";
input byte 000. ;
* 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 HTML5
与 inline
选项结合使用直接执行此操作。请参阅文档 here.
另请参阅 Don Henderson 的 this post,它提供了解决此问题的类似方法。感谢 Vasilij link.
使用 SASjs 您可以将任何二进制内容编译成 SAS Web 服务(存储过程或 Viya 作业)。
下面是一个使用 MP3 文件的示例:https://github.com/allanbowe/sasrap
我正在使用 SAS STP 创建报表,我想在报表上显示图像(徽标)。好的,这是正在发生的事情:
data _null_;
file _webout;
put '<html>';
put '</html>';
run;
我正在使用 HTML,因为我需要显示复杂的 table 格式,但我没有使用 %STPBEGIN
和 %STPEND
,因为这会打开 ODS坦率地说,我不知道如何处理流,我遇到了问题。不使用 %STPBEGIN
表示上面的代码。这对我来说是一个非常成功的机制。我可以用 CSS 和一切来展示漂亮的报告。唯一的问题是图像。一位客户最近要求在每份报告上贴上徽标。我虽然这很容易,但事实并非如此。好的,这就是交易,我尝试使用 <img src=" "/ >
标签,我想我会使用一些相对路径,我的图像就会显示出来。这项技术成功了,也失败了。
- 我使用 SAS 管理控制台将图像添加到文件夹位置 并使用其相对路径“/Products/SAS Enterprise GRC/****”(无效)
- 我将一张图片复制到 Web/Staging/*** 下默认主题的图片文件夹,并尝试使用相对路径(没有用)。所以我尝试使用默认主题中的其他图像。成功了。
我卡住了,如何在这里使用自定义图像?
当您在 SAS 元数据中定义图片时,可以通过 SAS 内容服务器访问它。 要获取图片 URL,请登录:“https://severhost/SASContentServer/repository/default/sasfolders”并搜索您的图片。
如果您在目录 /Products/SAS Enterprise GRC/PictureName.gif 中定义了图片,应该可以从地址“https://severhost/SASContentServer/repository/default/sasfolders/Products/SAS Enterprise GRC/PictureName.gif(Report)”访问它
当然你要记住,客户用户需要在 SAS 元数据中具有访问权限才能读取图片对象。
如果这不能解决您的问题,请输入您使用的 SAS 软件版本。
我遇到过和你类似的问题。我已将图像添加到我们的 Intranet,当时恰好是 SharePoint。我将该图像定义为具有 public 访问级别,然后在我的所有报告中进行引用。
由于报告仅供内部观众使用,他们都可以访问内联网,但不一定可以访问内容服务器,因此可以避免 Bagin 提到的问题。
如果您没有合适的内联网,您总是可以从您的 public 网站引用一个徽标,该徽标可能可供所有受众使用,即使他们是外部受众,但您没有控制该徽标文件,有一天它可能会以某种不受欢迎的方式发生变化。
此致, 瓦西里
如果您的图像是静态的,您可以使用数据步将其嵌入到结果中,而无需将文件复制到服务器。
这样做的技巧是将图像编码为 Base64 编码,然后您可以使用这个神奇的符号将图像嵌入到 <img src="" />
语句中:
<img src="data:image/png;base64,...." />
你可以看到 src=
属性包含元数据来告诉浏览器该值包含图像数据,代表一个 png 文件(我在测试这个 post 时使用了一个 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 很简单。对于 "online base64 image converter",例如 this one,您可以简单地 google。拖放您的图片,它会为您生成 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 base64_string 767;
infile "\your_sasdir\hi.png" recfm=n;
file "\your_sasdir\hi.base64";
input byte 000. ;
* 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 HTML5
与 inline
选项结合使用直接执行此操作。请参阅文档 here.
另请参阅 Don Henderson 的 this post,它提供了解决此问题的类似方法。感谢 Vasilij link.
使用 SASjs 您可以将任何二进制内容编译成 SAS Web 服务(存储过程或 Viya 作业)。
下面是一个使用 MP3 文件的示例:https://github.com/allanbowe/sasrap