1

Тема: Вставить картинку (image) в XML-документ.

Иногда нужна вставка изображения внутри текста в  XML-документе.

Будет сгенерирована такая структура:

<object data="data:image/jpeg;base64,/9j/4AAQSkZJRgAB.... u5yp6c5ooGf/Z"></object>

Функция получает текст, в котором есть ссылки на картинки
Лотус код:

Function Replace_img(mytext  As String) As String 'ищем картинки в тексте и конвертим их в base64 12.06.2020 14.00 актуализировано с CIT   v 1.0
    On Error Goto ErrH   
    Const sub_dir="doctmp.files"
    Const c_files_ext="jpeg; jpg; png; tif"    'для проверки на типы картинок которые могут быть в тексте
'    Const c_files_ext="jpeg; jpg; tif"    'для проверки на типы картинок которые могут быть в тексте
    
    Dim inStream As NotesStream, patchName As String, fileName As String, session As New NotesSession, c_files_MIME List As String    
    Set inStream=session.Createstream()     
    
    patchName=datapatch+sub_dir
    
    If  Dir$ (patchName,16 )="" Then  ' проверка на наличие  папки "doctmp.files", т.к. если в шаблоне в тексте нет картинок, то эта папка не создается
        Replace_img=mytext
        Exit Function
    '    Mkdir datapatch
    '    Mkdir datapatch+"\OUT"
    End If
    
    patchName=patchName+"\"    
    
    fileName = Dir$(patchName, 0)    
    
    If fileName$<>"" Then
        arr=Split(c_files_ext,"; ")
        Gosub const_zapoln                
    End If
    
    Do While fileName$ <> ""
        Print "картинка: "+fileName$
        If Not Isnull(Arraygetindex(arr,Lcase(Strrightback(fileName$, "."))))    Then 'проверяем на допустимый тип картинки
%REM
дана подстрока 
<img width=236 height=420 id="Рисунок 1" src="doctmp.files/image001.jpg">
ее нужно заменить на соответствующий base64 файл
%END REM
        'нужно найти src="doctmp.files/image001.jpg"
            If Instr(mytext, {src="}+sub_dir+{/}+fileName$+{">})>0 Then 'если в html файле есть картинка которая есть в директории - то преобразовываем картинку в base64
                L_str$=Strleft(mytext, {src="}+sub_dir+{/}+fileName$+{">}) 'вырезали все что до src="doctmp.files/image001.jpg">
                L_str$=Strleftback(  L_str$ ,  {<img})                                 'вырезали все что до <img        
                R_str$=Strright(mytext, {src="}+sub_dir+{/}+fileName$+{">})        ''вырезали все что после src="doctmp.files/image001.jpg"
                
                Call inStream.Open(patchName & fileName$, "binary")    ' в поток inStream файл        
                Dim b64 As New CBase64()
                plainText$ =  b64.encode (inStream)        
                plainText$=     Replace(plainText$,Chr(10),"") ' удаляем спецсимволы во вложениях
                plainText$=     Replace(plainText$,Chr(9),"")
                plainText$=     Replace(plainText$,Chr(13),"")
                Call inStream.Close
                Kill patchName & fileName$
        'склеиваем результат            
                mytext = L_str$  + {<object }+Replace(c_files_MIME(Lcase(Strrightback(fileName$, "."))),"href","data")
                mytext = mytext + plainText$ +{"></object>} 
                mytext = mytext +R_str$+ Chr(13)                                            
            End If
            
        End If
        fileName$ = Dir$()
    Loop
    Replace_img=mytext
    Exit Function
    
const_zapoln:
    ' https://ru.wikipedia.org/wiki/Список_MIME-типов      -   подсказка
    c_files_MIME("jpeg")    =    {href="data:image/jpeg;base64,}
    c_files_MIME("jpg")    =    {href="data:image/jpeg;base64,}
    c_files_MIME("png")    =    {href="data:image/png;base64,}
    c_files_MIME("tif")        =    {href="data:image/tif;base64,}
    Return
ErrH:    
    Print "Ошибка ф-ции  Replace_img  " & Error(Err) & " в строке " & Erl    
End Function

Поделиться