Использование изображения в потоке HTML хранимого процесса SAS
Я создаю отчет с помощью SAS STP и хочу отобразить изображение (логотип) в отчете. Хорошо, вот что происходит:
data _null_;
file _webout;
put '<html>';
put '</html>';
run;
Я ставлю HTML, потому что у меня есть сложные форматы таблиц, которые мне нужно отобразить, и я не использую %STPBEGIN
& %STPEND
потому что это открывает поток ОРВ, который, честно говоря, я не знаю, как справиться, и у меня возникли проблемы. Не используется %STPBEGIN
означает приведенный выше код. Это был очень успешный механизм для меня. Я могу показать красивые отчеты с CSS и все. Единственная проблема - изображения. Недавно клиент попросил разместить логотип на каждом отчете. Я думал, что это будет легко, но это не так. Хорошо, вот сделка, я пытался использовать <img src=" "/ >
тег, и я думал, что я буду использовать некоторый относительный путь, и мое изображение покажет. Эта техника прошла успешно и провалилась.
- Я добавил изображение в папку с помощью SAS Management Console и использовал его относительный путь "/Products/SAS Enterprise GRC/****" (не работал)
- Я скопировал изображение в папку с изображениями темы по умолчанию в Web/Staging/*** и попытался использовать относительный путь (не работал). Поэтому я попытался использовать другие изображения из темы по умолчанию. Это сработало.
Я застрял, как я могу использовать пользовательские изображения здесь?
4 ответа
Если ваше изображение статично, вы можете встроить его в свои результаты с помощью шага данных, не копируя файлы на сервер.
Хитрость заключается в том, чтобы закодировать изображение в кодировку 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 очень просто. Вы можете просто найти в Google "онлайн конвертер изображений base64", такой как этот. Перетащите изображение, и оно создаст для вас код base64.
Чтобы получить это в шаге данных в SAS, это просто случай:
data _null_;
file _webout;
put '<html>';
put '<img src="data:image/png;base64,iVBORw0KGgoAAAAN......etc..." />';
put '</html>';
run;
Если ваше изображение особенно велико (скажем, больше ~ 32 КБ), вы можете столкнуться с проблемами, пытаясь вывести его из шага данных. Мне, наверное, нужно проверить это, чтобы уточнить. Вы можете обойти эту проблему, прочитав образ base64 из файла в SAS и направив его прямо на _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 HTML5
в сочетании с inline
вариант. Смотрите документ здесь.
Смотрите также эту статью Дона Хендерсона, которая предлагает аналогичный способ решения этой проблемы. Спасибо Василию за ссылку.
У меня была похожая проблема с тобой однажды. Я добавил изображение в нашу интрасеть, которая в то время была SharePoint. Я определил это изображение как уровень общего доступа, а затем ссылки во всех моих отчетах.
Идея в том, что, поскольку отчет предназначен только для внутренней аудитории, все они будут иметь доступ к интрасети, но необязательно к контент-серверу, поэтому он обходит проблему, о которой говорил Багин.
Если у вас нет подходящей интрасети, вы всегда можете сослаться на логотип с вашего общедоступного веб-сайта, который, вероятно, доступен для всей вашей аудитории, даже если он является внешним, но тогда вы не сможете контролировать этот файл логотипа и однажды это может измениться каким-то нежелательным образом.
С уважением, Василий
Используя SASjs , вы можете скомпилировать ЛЮБОЙ двоичный контент в веб-службу SAS (сохраненный процесс или задание Viya).
Вот пример использования файла MP3: https://github.com/allanbowe/sasrap
Когда вы определяете изображения в метаданных 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 (отчет)"
Конечно, вы должны помнить, что пользователь-пользователь должен иметь разрешение на доступ к метаданным SAS для чтения объекта изображения.
Если это не решит вашу проблему, укажите, какую версию программного обеспечения SAS вы используете.