Использование изображения в потоке 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 вы используете.

Другие вопросы по тегам