Имя: Пароль:
1C
1С v8
Форматированный документ, Print Screen, вставка из буфер
,
0 Geroy
 
27.08.20
15:38
Всем привет.

1. Выполнена команда Print Screen и вставка с буфера в форматированный документ.
2. Картинка отобразилась в форматированном документе.
3. Строка картинки очень похожа на строку base64 но не она,  
   так как любые попытки перевести строку в двоичные данные и сохранения уже как картинки в файл были безуспешны.
4. Пример: ФД.ПолучитьЭлементы(), КартинкаФорматированногоДокумента, Строка = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CAIAAABnsVYUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAP-........"

5. Также
Вложения = Новый Структура();
ФД.ПолучитьHTML(Текст, Вложения);

вернул пустую структуру вложений

Вопрос: что за формат строки и как перевести в двоичные данные и сохранить как картинку?
1 Geroy
 
28.08.20
10:00
Проблема в том, что картинка с форматированного документа попадет в html, а из него в печатную форму.
2 acht
 
28.08.20
10:11
Судя по всему это таки png в base64.
Возьми строку после ";base64,", выровняй длину и получи из нее двоичные данные.
3 Geroy
 
28.08.20
10:29
(2) Что значит выровнять длину?
1. Пробовал взять всё после запятой и загнать двоичные данные, получаю Неопределено
2. Если беру с запятой получаю тип двоичные данные, но значение пусто
3. Если беру всю строку в base64Значение получаю тип двоичные данные и значение заполнено, но при сохранении на диск битый файл.
4 Geroy
 
28.08.20
10:45
Еще заметил что строка содержит "-" и "_", именно если принт скрин и сразу вставить в форматированный документ
5 acht
 
28.08.20
10:47
(3) Длина строки должна быть кратна 4. Дополняется символами =
6 acht
 
28.08.20
10:51
(4) А "-" и "_" - это скорей всего надо поменять на "/" и "+". Какой-то вариант base64 для урлов
7 Geroy
 
28.08.20
10:57
(5) не помогло
(6) вот и у меня подозрения, так как когда вставляешь картинку не из буфера, то данные символы отсутствуют
8 Geroy
 
28.08.20
11:00
(6)
По причине этого существует изменённый Base64 для URL, где не используется заполнение символом = и символы + и / соответственно заменяются на * и -, так что использование кодеров/декодеров URL перестаёт быть необходимым и не имеет никакого воздействия на длину закодированного значения, оставляя ту же самую закодированную форму, неповреждённую для использования в реляционных базах данных, веб-формах и идентификаторах объекта вообще. Стандартом Base64-кодирования URL адресов признается вариант, когда символы + и / заменяются, соответственно, на - и _ (RFC 3548, раздел 4).
9 Geroy
 
28.08.20
11:21
Замена не помогла, и выравнивание кратно 4 тоже не помогло

"-" на "+"
"_" на "/"
10 PloAl
 
28.08.20
12:03
(9) Получите из существующего *.png строку base64 в форматированном документе.
Проделайте такую же операцию не в 1с на другом ЯП или с помощью онлайн конвертера.
И сравните получившиеся строки.
11 Geroy
 
28.08.20
12:04
(7) Спасибо, получилось.
Помог понять принцип этот сервис __http://www.base64url.com/

Для каждого стр из НовыйКомментарий.ПолучитьЭлементы() Цикл
        Если Тип(Стр) = Тип("КартинкаФорматированногоДокумента") Тогда
            Если Найти(Стр.Картинка,"base64")> 0 тогда
                
                СтрокаКартинка = Стр.Картинка;
                
                НачалоФормата =  Найти(СтрокаКартинка, "image/")+СтрДлина("image/");
                КонецФормата  =  Найти(СтрокаКартинка,";");
                ФорматИзображения = Сред(СтрокаКартинка,НачалоФормата, КонецФормата - НачалоФормата);
                
                БезНачала = Сред(Стр.Картинка,Найти(Стр.Картинка, "base64,")+СтрДлина("base64,"));
                
                БезНачала = СтрЗаменить(БезНачала, "-", "+");
                БезНачала = СтрЗаменить(БезНачала, "_", "/");
                
                ДлинаСтроки = СтрДлина(БезНачала) / 4;
                
                Пока ДлинаСтроки <> Цел(ДлинаСтроки) цикл
                        
                   БезНачала = БезНачала +"=";
                   ДлинаСтроки = СтрДлина(БезНачала) / 4;
                    
                КонецЦикла;    
                                
                БС = Base64Значение(БезНачала);
                
                ИмяФайла = ПолучитьИмяВременногоФайла(ФорматИзображения);
                        
                БС.Записать(ИмяФайла);
                
            КонецЕсли;                
        КонецЕсли;        
    КонецЦикла;
12 Garykom
 
гуру
28.08.20
12:08
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший