Контент в Rich Text Area field

Контент в Rich Text Area field

Задача следующая - выгрузить в ворд кастомно собранный отчёт (VF страница). Содержание отчёта включает в себя содержимое полей Rich Text с картинками. Как выгрузить картинки в ворд я знаю, но тут стала проблема с этими ричтекстами. Я не знаю, как мне получить блоб картинки из ричтекста. Там ведь html код, и картинка существует в виде тега <img> с путём типа https://c.cs20.content.force.com/servlet/rtaImage?eid=ka3m0000000XXXX&feoid=00Nm0000000XXXX&refid=0EMm0000000XXXX. Выгрузка в ворд - строгое требование, так что пдф не прокатит. Есть какие-нибудь идеи?

Берешь какчаешь картинку и конвертируешь в Blob.

Нет, заказчик постит свои маленькие статейки с картинками в рич тексты, и хочет чтобы всё это в примерно таком же виде попало в ворд. Открывает он превью своего отчёта, тыкает кнопку download, и получает ворд документ со своим содержимым. Не буду же я вручную все его картинки блобить и заливать в документы )

Tellen
Не буду же я вручную все его картинки блобить и заливать в документы )

Зачем в ручную-то, ты ж программист!

Спасибо за содержательный ответ.

Берешь текст, находишь тег img, берешь его src, качаешь картинку, преобразуешь в блоб, вставляешь вместо ссылки итд.
Самый просто вариант, но упадешь на максимальном количестве символов.

Расскажи еще мне, что ты под word понимаешь?

Tellen
Спасибо за содержательный ответ.

Да не за что.

Gres
качаешь картинку,

Вот этот момент не понимаю. Я предполагал на лету при выгрузке хватать блобы и делать из них документы и расставлять в нужные места в ричтекстах. Документы будут в данном случае "буффером" который будет нужен для выгрузки картинок из форса. Они потом щщедулем будут удаляться из папки. Но увы, не понимаю, что данном случае будет процессом скачивания, и куда, и в виде чего.

Gres
Расскажи еще мне, что ты под word понимаешь?

MS Word. ContentType странице задать соответствующий.

Tellen
MS Word. ContentType странице задать соответствующий.

Спешу тебя огорчить, если ты поставишь html странице ContentType, она не перестанет быть html страницей.

Gres
Спешу тебя огорчить
Благодарю, но я и не предполагал, что она перестанет ей быть. Но изображение по тому src что я привёл не загрузится, ворд, открывши этот файл картинку не увидит.

Tellen
Вот этот момент не понимаю.

У тебя есть url, тебе нужно взять его содержимое и конвертировать в Blob

Tellen
Но изображение по тому src что я привёл не загрузится, ворд, открывши этот файл картинку не увидит.

Если будет в паблике, то загрузится

Gres
Если будет в паблике

Всмысле в паблике? Чему нужен доступ? Полю? Записи? Какого рода доступ?

Tellen
Но изображение по тому src что я привёл не загрузится, ворд, открывши этот файл картинку не увидит.

Да, потому что они закрыты авторизацией. Как вариант выложить картинки на какой нибудь Amazon S3 и на лету подменять url на публичные. С переводом в blob есть большая вероятность попасть на лимиты.

Tellen
Всмысле в паблике? Чему нужен доступ? Полю? Записи? Какого рода доступ?

Картинка должна быть в публичном доступе, т.е. её можно открыть по прямой ссылке без регистрации и смс.

Dmitry Shnyrev
Да, потому что они закрыты авторизацией.

О, Дима, присоединился, ты, наверно, быстрее меня объяснишь человеку, что нужно делать)

Вот тут вроде что-то похожее
http://salesforce.stackexchange.com/questions/63713/images-are-not-displaying-in-ms-word-doc

Gres
О, Дима, присоединился, ты, наверно, быстрее меня объяснишь человеку, что нужно делать)

И тебе привет
Да мне кажется все и так тут понятно

Не люблю я конечно такие требования заказчиков - "хочу чтобы в ворде было так же как в браузере". Понятно откуда ноги растут - видели где-то и думают что это все мелочи для программиста - работы на 1 час. А ничего что за такими же решениями (тот же google docs) стоят 1000 программистов и не один год работы. Вообще у .doc файлов свой внутренний формат и я далек от мысли что Tellen генерирует структуру именно в таком формате. А скармливать Word кусок HTML и надеяться что потом заказчик не прибежит и не начнет ругаться почему у него шрифт не такой и стили поплыли надо иметь стальные нервы

Dmitry Shnyrev
Да, потому что они закрыты авторизацией

Именно ) Как и всё, кроме стандартных форсовых докуентов требует для доступа обязательной авторизации. Когда мне нужно было выгружать картинки, лежащие а атачментах, я просто брал их body и засовывал в документы. Подменять одно на другое на лету это элементарно. Но с картинками из ричтекста я просто не нашёл способа ничего сделать. Они там гвоздями прибиты.Есть путь на сервлет, и не понятно, дальше то что. Хотя тут я во многом нуб конечно.

Dmitry Shnyrev
Вот тут вроде что-то похожее

Да, видел вчера. "Попросить пользователя загрузить нужную картинку атачментом" - это совсем не вариант.

Tellen
Но с картинками из ричтекста я просто не нашёл способа ничего сделать. Они там гвоздями прибиты.

Хороший вопрос. А где они лежат кстати? Как-то не доходили руки посмотреть. Скинь ссылку для примера.
По идее они должны складывать в File Storage и кушать лимиты.

Я сам с примерно похожим функционалом работаю (статьи с картинками клиент может делать) - так мы (вернее еще до меня) отказались от идеи использовать RichTextArea. У нас сделана кастомная страница с ckEditor, который складывает статью в обычный Long Text field, а картинки заливаются на Amazon S3 с помощью кастомного ImageBrowser который подключается с ckEditor. Зато все универсально и гибко.

ЗЫ RichTextArea это зло!

Tellen
https://c.cs20.content.force.com/servlet/rtaImage?eid=ka3m0000000XXXX&feoid=00Nm0000000XXXX&refid=0EMm0000000XXXX.

<img src="https://c.cs18.content.force.com/servlet/servlet.ImageServer?id={!awf.buffDocument.Id}&oid={!$Organization.Id}" />
вот эта ссылка, например не требует авторизаций, и спокойно выгружается локально. (это наверное всем известно).

Так вот же. Как только загружаешь картинку через попап в редакторе, ей сразу присваивается такой путь. Была идея с кастомным ск, думал может там можно этот блоб отовить, но от кастомного на проекте в прошлом отказались.

Dmitry Shnyrev
ЗЫ RichTextArea это зло!

Воистину

Dmitry Shnyrev
. А где они лежат кстати?

Внутреннии объект недоступный для доступа

А в чем проблема ссылки то заменять?

В том, что Id в ссылке на servlet/rtaImage (refId параметр) по типу не соответствует тому, который в servlet.ImageServer. Поскольку в первом случае, как ты сказал, это внутренний закрытый объект, а во втором - обычный salesforce document.

Tellen
В том, что Id в ссылке на servlet/rtaImage (refId параметр) по типу не соответствует тому, который в servlet.ImageServer. Поскольку в первом случае, как ты сказал, это внутренний закрытый объект, а во втором - обычный salesforce document.

В данном случае тебе не нужно иметь никакого доступа к объекту, ты просто можешь взять картинку, и конвертировать ии в blob или залить на сторонний ресурс и поменять ссылку.

Gres
ты просто можешь взять картинку, и конвертировать ии в blob

Вот меня как раз и интересует, каким образом я могу автоматически, в коде, брать эти картинки и конвертировать в блоб. http get не канает, он мне в теле возвращает else if на джаваскрипте.

Tellen
Вот меня как раз и интересует, каким образом я могу автоматически, в коде, брать эти картинки и конвертировать в блоб. http get не канает, он мне в теле возвращает else if на джаваскрипте.

Неправильно запрос посылаешь. Куки нужны.

Погоди, я слал запрос из апекса, добавляя аутентификацию (юзернейм + пароль). Куки...из JS слать запрос? и там же блобить?

Tellen
Погоди, я слал запрос из апекса, добавляя аутентификацию (юзернейм + пароль). Куки...из 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 ответа.

Gres
У вас же CTC 100500 умных людей

На самом деле, у нас дискуссия пошла по тому же пути, что и в топике. Похожая задча была, но материалы грузились в ПДФ. Там нет такой проблемы, все картинки подтягиваются.

А редирект уже учтён

я оттрейсил эту штуку 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

Tellen
https://eu5.salesforce.com/content/session?url="https://c.eu5.content.force.com/servlet/rtaImage?...

По ссылке можно догадаться чего тебе не хватает.

У меня была подобная задача, я логинился на 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?
Почему нельзя использовать сессию текущего пользователя?

Какой хороший эффект, как только в группе написла про форум и сразу все участники в здесь)

На долго ли?

Ну ладно, я буду продолжать искать решение, если найду - напишу тут. Всем спасибо за помощь )

Interesting information? Help us, post link to social media..