Задача следующая - выгрузить в ворд кастомно собранный отчёт (VF страница). Содержание отчёта включает в себя содержимое полей Rich Text с картинками. Как выгрузить картинки в ворд я знаю, но тут стала проблема с этими ричтекстами. Я не знаю, как мне получить блоб картинки из ричтекста. Там ведь html код, и картинка существует в виде тега <img> с путём типа https://c.cs20.content.force.com/servlet/rtaImage?eid=ka3m0000000XXXX&feoid=00Nm0000000XXXX&refid=0EMm0000000XXXX. Выгрузка в ворд - строгое требование, так что пдф не прокатит. Есть какие-нибудь идеи?
Берешь какчаешь картинку и конвертируешь в Blob.
Нет, заказчик постит свои маленькие статейки с картинками в рич тексты, и хочет чтобы всё это в примерно таком же виде попало в ворд. Открывает он превью своего отчёта, тыкает кнопку download, и получает ворд документ со своим содержимым. Не буду же я вручную все его картинки блобить и заливать в документы )
Зачем в ручную-то, ты ж программист!
Спасибо за содержательный ответ.
Берешь текст, находишь тег img, берешь его src, качаешь картинку, преобразуешь в блоб, вставляешь вместо ссылки итд.
Самый просто вариант, но упадешь на максимальном количестве символов.
Расскажи еще мне, что ты под word понимаешь?
Да не за что.
Вот этот момент не понимаю. Я предполагал на лету при выгрузке хватать блобы и делать из них документы и расставлять в нужные места в ричтекстах. Документы будут в данном случае "буффером" который будет нужен для выгрузки картинок из форса. Они потом щщедулем будут удаляться из папки. Но увы, не понимаю, что данном случае будет процессом скачивания, и куда, и в виде чего.
MS Word. ContentType странице задать соответствующий.
Спешу тебя огорчить, если ты поставишь html странице ContentType, она не перестанет быть html страницей.
Благодарю, но я и не предполагал, что она перестанет ей быть. Но изображение по тому src что я привёл не загрузится, ворд, открывши этот файл картинку не увидит.
У тебя есть url, тебе нужно взять его содержимое и конвертировать в Blob
Если будет в паблике, то загрузится
Всмысле в паблике? Чему нужен доступ? Полю? Записи? Какого рода доступ?
Да, потому что они закрыты авторизацией. Как вариант выложить картинки на какой нибудь Amazon S3 и на лету подменять url на публичные. С переводом в blob есть большая вероятность попасть на лимиты.
Картинка должна быть в публичном доступе, т.е. её можно открыть по прямой ссылке без регистрации и смс.
О, Дима, присоединился, ты, наверно, быстрее меня объяснишь человеку, что нужно делать)
Вот тут вроде что-то похожее
http://salesforce.stackexchange.com/questions/63713/images-are-not-displaying-in-ms-word-doc
И тебе привет
Да мне кажется все и так тут понятно
Не люблю я конечно такие требования заказчиков - "хочу чтобы в ворде было так же как в браузере". Понятно откуда ноги растут - видели где-то и думают что это все мелочи для программиста - работы на 1 час. А ничего что за такими же решениями (тот же google docs) стоят 1000 программистов и не один год работы. Вообще у .doc файлов свой внутренний формат и я далек от мысли что Tellen генерирует структуру именно в таком формате. А скармливать Word кусок HTML и надеяться что потом заказчик не прибежит и не начнет ругаться почему у него шрифт не такой и стили поплыли надо иметь стальные нервы ![]()
Именно ) Как и всё, кроме стандартных форсовых докуентов требует для доступа обязательной авторизации. Когда мне нужно было выгружать картинки, лежащие а атачментах, я просто брал их body и засовывал в документы. Подменять одно на другое на лету это элементарно. Но с картинками из ричтекста я просто не нашёл способа ничего сделать. Они там гвоздями прибиты.Есть путь на сервлет, и не понятно, дальше то что. Хотя тут я во многом нуб конечно.
Да, видел вчера. "Попросить пользователя загрузить нужную картинку атачментом" - это совсем не вариант.
Хороший вопрос. А где они лежат кстати? Как-то не доходили руки посмотреть. Скинь ссылку для примера.
По идее они должны складывать в File Storage и кушать лимиты.
Я сам с примерно похожим функционалом работаю (статьи с картинками клиент может делать) - так мы (вернее еще до меня) отказались от идеи использовать RichTextArea. У нас сделана кастомная страница с ckEditor, который складывает статью в обычный Long Text field, а картинки заливаются на Amazon S3 с помощью кастомного ImageBrowser который подключается с ckEditor. Зато все универсально и гибко.
ЗЫ RichTextArea это зло!
<img src="https://c.cs18.content.force.com/servlet/servlet.ImageServer?id={!awf.buffDocument.Id}&oid={!$Organization.Id}" />
вот эта ссылка, например не требует авторизаций, и спокойно выгружается локально. (это наверное всем известно).
Так вот же. Как только загружаешь картинку через попап в редакторе, ей сразу присваивается такой путь. Была идея с кастомным ск, думал может там можно этот блоб отовить, но от кастомного на проекте в прошлом отказались.
Воистину
Внутреннии объект недоступный для доступа
А в чем проблема ссылки то заменять?
В том, что Id в ссылке на servlet/rtaImage (refId параметр) по типу не соответствует тому, который в servlet.ImageServer. Поскольку в первом случае, как ты сказал, это внутренний закрытый объект, а во втором - обычный salesforce document.
В данном случае тебе не нужно иметь никакого доступа к объекту, ты просто можешь взять картинку, и конвертировать ии в blob или залить на сторонний ресурс и поменять ссылку.
Вот меня как раз и интересует, каким образом я могу автоматически, в коде, брать эти картинки и конвертировать в блоб. http get не канает, он мне в теле возвращает else if на джаваскрипте.
Неправильно запрос посылаешь. Куки нужны.
Погоди, я слал запрос из апекса, добавляя аутентификацию (юзернейм + пароль). Куки...из JS слать запрос? и там же блобить?
Все правильно отправляешь запрос с сервера.
Покажи запрос?
У вас же CTC 100500 умных людей, или у вас не принято помогать друг другу?
Из пробного класса
public static String picURL = 'https://eu5.salesforce.com/content/session?url="https://c.eu5.content.force.com/servlet/rtaImage?eid=a092400000139vo&feoid=00N2400000BM3TG&refid=0EM24000000LGBx"';public static Blob getData(String url) {
String username = 'username';
String password = 'password';
HttpRequest req = new HttpRequest();
req.setEndpoint(url);
req.setMethod('GET');
Blob headerValue = Blob.valueOf(username +':' +password);
String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue);
req.setHeader('Authorization', authorizationHeader);
Http binding = new Http();
HttpResponse res = binding.send(req);
system.debug('res // ' + res);
system.debug('body // ' + res.getBody());
Blob image = res.getBodyAsBlob();
system.debug('BLOB image // ' + EncodingUtil.base64Encode(image));
return image;}
Скорее всего тебя редиректит, проверь header ответа.
На самом деле, у нас дискуссия пошла по тому же пути, что и в топике. Похожая задча была, но материалы грузились в ПДФ. Там нет такой проблемы, все картинки подтягиваются.
А редирект уже учтён
я оттрейсил эту штуку https://c.eu5.content.force.com/servlet/rtaImage?
и получил вот это
https://eu5.salesforce.com/content/session?url="https://c.eu5.content.force.com/servlet/rtaImage?...
Можешь посмотреть как ребята делают - https://github.com/financialforcedev/apex-mdapi
По ссылке можно догадаться чего тебе не хватает.
У меня была подобная задача, я логинился на login.salesforce.com, сохранял куки, а потом переходил по любой ссылке и получаол требуемый контент. Все работало отлично. Естественно было куча редиректов.
На топкодере когда-то была похожая задача.
Да, можно догадаться, что это Id сессии, но как называется параметр? ибо трейс мне возвращает в адрес в виде
https://eu5.salesforce.com/content/session?url=https%3A%2F%2Fc.eu5.content.force.com%2Fservlet%2FrtaImage
Я же говорю, посмотри параметры на login.salesforce.com
Народ, я что-то не совсем понял из последних сообщений.
А зачем использовать логин+пароль и login.salesforce.com?
Почему нельзя использовать сессию текущего пользователя?
Какой хороший эффект, как только в группе написла про форум и сразу все участники в здесь)
На долго ли? ![]()
Ну ладно, я буду продолжать искать решение, если найду - напишу тут. Всем спасибо за помощь )