%REM
Function ProverkaForAttach
Description: Comments for Function
%END REM
Function Proverka_attach(mes As String, namefile As String) As Boolean
On Error GoTo errh
Dim mas_tmp As Variant, item As NotesItem, ws As New NotesUIWorkspace, dc As NotesDocumentCollection
Dim i As Integer, view As NotesView, tmp As String, sep As String, b As Boolean, c_files_ext As string
Dim rtitemA As Variant, idx As Variant, oname As String, mas() As String, picklist As Variant
Proverka_attach=True
pars_template="0"
If Not L_doc.HasEmbedded Then mes="Нет вложений в документе!." : Error 1000
' Индивидуальные значения для организации
Set view = L_db.GetView ("reg" )
Set doc_reg = view.GetFirstDocument
If doc_reg Is Nothing Then mes="Нет доступа к настройкам регистрации!" : Error 1000
'выбор шаблона по которому будем формировать
Set view = L_db.GetView("searchtemplates")
picklist = ws.PickListStrings(PICKLIST_CUSTOM, False, L_db.Server, L_db.FilePath, "admin_templatesO1", "Шаблоны", "Выберите шаблон, по которому будем формировать XML:", 2)
If IsEmpty(picklist) Then mes="Шаблон не выбран!" : Error 1000
Set dc = view.GetAllDocumentsByKey(picklist(0), True)
Set doc_templ = dc.GetFirstDocument()
If doc_templ Is Nothing Then mes="Не найден документ шаблона": Error 1000
'выбор приложения с которого будем формировать
Set rtitemA=Nothing
idx=ArrayGetIndex(doc_templ.name_rekv, "приложение")
If Not IsNull(idx) Then
If doc_templ.items_notes_doc(idx)<>sys_NUL$ Then
Set rtitemA = L_doc.GetFirstItem(doc_templ.items_notes_doc(idx))
Else
mes="В документе шаблона не указано поле для приложений." : Error 1000
End If
Else
mes="В документе шаблона не указано поле для приложений." : Error 1000
End If
i=0
If Not rtitemA Is Nothing Then
Call rtItemA.update
If rtitemA.Type = RICHTEXT Then
If Not IsEmpty(rtitemA.EmbeddedObjects) Then
ForAll empID In c_files_MIME 'собираем список допустимых типов файлов для приложений
If c_files_ext$="" Then c_files_ext$=ListTag(empID) Else c_files_ext$=c_files_ext$+", "+Listtag(empID)
End ForAll
ForAll obj In rtitemA.EmbeddedObjects
If ( obj.Type = EMBED_ATTACHMENT ) Then
If Not IsElement(c_files_MIME(LCase(StrRightBack(obj.Source , ".")))) Then 'проверим на соответствие типов приложений
mes="Допустимы приложения в форматах: "+c_files_ext$
Error 1000
End If
If LCase(StrRightBack(obj.Source , "."))="docx" Or LCase(StrRightBack(obj.Source , "."))="docm" Then
oname$ = Replace_OName(CStr(obj.Source ))
ReDim Preserve mas(i)
mas(i)=oname$
i=i+1
End If
End If
End ForAll
End If
End If
Else
mes="В документе нет итема для приложений." : Error 1000
End If
If i=0 Then mes="Нет подходящего вложения в документе!." : Error 1000
'вывод списка для выбора вложения
Erase picklist
picklist = ws.Prompt (PROMPT_OKCANCELLIST, "Выбор приложения", "Выберите приложение из которого необходимо формировать XML.", "", mas)
If IsEmpty (picklist) Then mes="Не выбрано приложение для формирования XML!." : Error 1000
namefile=picklist
tmp$=""
sep$=""
i=0
'проверяем на обязательность заполнения полей в документе лотус
ForAll v In doc_templ.flag_obyaz_XML
If v="1" Then
If doc_templ.items_notes_doc(i)<>sys_NUL$ Then
mas_tmp=Split(doc_templ.items_notes_doc(i),sys_sep$)
b=True
ForAll v1 In mas_tmp
If L_doc.HasItem(v1) Then
Set item=L_doc.GetFirstItem(v1)
If Trim( item.Text )="" Then b=False:Exit ForAll
End If
End ForAll
If Not b Then tmp$=tmp$+sep$+Replace(doc_templ.name_rekv(i),"_"," ") : sep$=", "
End If
End If
i=i+1
End ForAll
If tmp$<>""Then mes= "Заполните все поля: " + tmp$ : Error 1000
ext:
Exit Function
errh:
Proverka_attach=False
If Err<>1000 Then mes="Ошибка пропускной системы " & Error(Err) & " в строке " & Erl
Resume ext
End Function
Function Replace_img(mytext As String) As String 'ищем картинки в тексте и конвертим их в base64
On Error GoTo ErrH
Const sub_dir="doctmp.files"
Const c_files_ext="jpeg; jpg; png; tif" 'для проверки на типы картинок которые могут быть в тексте
Dim inStream As NotesStream, patchName As String, fileName As String, session As New NotesSession, c_files_MIME List As String
Dim arr As Variant, L_str As String, R_str As String, plainText As String
Set inStream=session.Createstream()
patchName=datpatch+sub_dir
If Dir$ (patchName,16 )="" Then ' проверка на наличие папки "doctmp.files", т.к. если в шаблоне в тексте нет картинок, то эта папка не создается
Replace_img=mytext
Exit Function
' Mkdir datpatch
' Mkdir datpatch+"\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">
<img width=603 height=190 src="doctmp.files/image001.png" align=left hspace=12>
ее нужно заменить на соответствующий base64 файл
%END REM
'нужно найти src="doctmp.files/image001.jpg"
' If Instr(mytext, {src="}+sub_dir+{/}+fileName$+{">})>0 Then 'если в html файле есть картинка которая есть в директории - то преобразовываем картинку в base64
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$=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"
R_str$=StrRight(mytext, {src="}+sub_dir+{/}+fileName$+{"}) ''вырезали все что после src="doctmp.files/image001.jpg"
R_str$=StrRight(R_str$, {>}) ''вырезали все что после 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 "Библиотека 'MED_XML' ф-ция 'Replace_img'. Ошибка " & Error(Err) & " в строке " & Erl
End Function
Function Strclean (mystr As String) As String
On Error GoTo ErrH
Dim ascx As String, tmpstr As String, lenstr As Variant, x As Variant
tmpstr= ""
'tmpstr=mystr
lenstr = Len(mystr)
'MsgBox mystr
'%REM
For x=1 To lenstr 'очищаем от ненужных символов (указываем только те - которые нужны)
ascx = Mid$(mystr,x,1)
' If (Asc(ascx)>31) And (Asc(ascx)<38) Or ( Asc(ascx)>38 And Asc(ascx)<153) Or (Asc(ascx)>191) And (Asc(ascx)<256) _
' Or (Asc(ascx)=171) Or (Asc(ascx)=187) Or (Asc(ascx)=185) Then
If (Asc(ascx)>31 And Asc(ascx)<38) Or ( Asc(ascx)>38 And Asc(ascx)<153) Or (Asc(ascx)>191 And Asc(ascx)<256) _
Or Asc(ascx)=163 Or Asc(ascx)=165 Or Asc(ascx)=168_
Or Asc(ascx)=170 Or Asc(ascx)=171 Or Asc(ascx)=175 Or Asc(ascx)=178 Or Asc(ascx)=179_
Or Asc(ascx)=180 Or (Asc(ascx)>=184 And Asc(ascx)<=187)_
Or Asc(ascx)=191 Or Asc(ascx)=177 Then
tmpstr = tmpstr + ascx
End If
Next
'MsgBox tmpstr
'%END REM
'HTML символы заменяем (появляются после сохрания в html) http://_.ascii.cl/htmlcodes.htm
tmpstr = Replace(tmpstr,{quot;},{"}) ' "
tmpstr = Replace(tmpstr,{amp;},{&}) ' &
tmpstr = Replace(tmpstr,{lt;},{<}) ' <
tmpstr = Replace(tmpstr,{gt;},{>}) ' >
tmpstr = Replace(tmpstr,{nbsp;},{ }) ' неразрывный пробел
tmpstr = Replace(tmpstr,{iexcl;},{¡})
tmpstr = Replace(tmpstr,{cent;},{¢})
tmpstr = Replace(tmpstr,{pound;},{£})
tmpstr = Replace(tmpstr,{curren;},{¤})
tmpstr = Replace(tmpstr,{yen;},{¥})
tmpstr = Replace(tmpstr,{brvbar;},{¦})
tmpstr = Replace(tmpstr,{sect;},{§})
tmpstr = Replace(tmpstr,{uml;},{¨})
tmpstr = Replace(tmpstr,{copy;},{©})
tmpstr = Replace(tmpstr,{laquo;},{«})
tmpstr = Replace(tmpstr,{reg;},{®})
tmpstr = Replace(tmpstr,{macr;},{¯})
tmpstr = Replace(tmpstr,{euro;},{€})
tmpstr = Replace(tmpstr,{sup1;},{¹}) ' верхний индекс "один"
tmpstr = Replace(tmpstr,{sup2;},{²})
tmpstr = Replace(tmpstr,{sup3;},{³})
tmpstr = Replace(tmpstr,{frac14;},{¼}) 'дробь - одна четверть
tmpstr = Replace(tmpstr,{frac12;},{½}) ' дробь - одна вторая
tmpstr = Replace(tmpstr,{frac34;},{¾}) 'дробь - три четверти
'MsgBox tmpstr
'удаляем пустые параграфы
tmpstr = Replace(tmpstr,{<p><span style="padding:0px 10px;"></span></p>},"")
'fileNum% = Freefile()
'Open "C:\xml\temp.txt" For Append As fileNum%
'Print # fileNum%, tmpstr
'Close fileNum%
'Dim array1(1) As String ' для замены переносов строк в содержании
'Dim array2(1) As String
'array1(0) = Chr(13)
'array1(1) = Chr(9)
'array2(0) = "</p><p>"
'array2(1) = {<span style="padding:0px 10px;"></span>}
'tmpstr = Replace(tmpstr,array1,array2)
'tmpstr = "<p>" + tmpstr + "</p>"
'Msgbox tmpstr
Strclean = tmpstr
Exit Function
ErrH:
Print "Библиотека 'MED_XML' ф-ция 'Strclean'. Ошибка " & Error(Err) & " в строке " & Erl
End Function
Function Strclean2 (mystr As String) As String
' для обращения "Уважаемый", отдельная функция, т.к. может быть в ображении две строки с Имя Отчество.
On Error GoTo ErrH
Dim ascx As String, tmpstr As String
tmpstr= mystr
'HTML символы заменяем (появляются после сохрания в html) http://_.ascii.cl/htmlcodes.htm
tmpstr = Replace(tmpstr,{quot;},{"}) ' "
tmpstr = Replace(tmpstr,{amp;},{&}) ' &
tmpstr = Replace(tmpstr,{lt;},{<}) ' <
tmpstr = Replace(tmpstr,{gt;},{>}) ' >
tmpstr = Replace(tmpstr,{nbsp;},{ }) ' неразрывный пробел
tmpstr = Replace(tmpstr,{iexcl;},{¡})
tmpstr = Replace(tmpstr,{cent;},{¢})
tmpstr = Replace(tmpstr,{pound;},{£})
tmpstr = Replace(tmpstr,{curren;},{¤})
tmpstr = Replace(tmpstr,{yen;},{¥})
tmpstr = Replace(tmpstr,{brvbar;},{¦})
tmpstr = Replace(tmpstr,{sect;},{§})
tmpstr = Replace(tmpstr,{uml;},{¨})
tmpstr = Replace(tmpstr,{copy;},{©})
tmpstr = Replace(tmpstr,{laquo;},{«})
tmpstr = Replace(tmpstr,{reg;},{®})
tmpstr = Replace(tmpstr,{macr;},{¯})
tmpstr = Replace(tmpstr,{euro;},{€})
tmpstr = Replace(tmpstr,{sup1;},{¹}) ' верхний индекс "один"
tmpstr = Replace(tmpstr,{sup2;},{²})
tmpstr = Replace(tmpstr,{sup3;},{³})
tmpstr = Replace(tmpstr,{frac14;},{¼}) 'дробь - одна четверть
tmpstr = Replace(tmpstr,{frac12;},{½}) ' дробь - одна вторая
tmpstr = Replace(tmpstr,{frac34;},{¾}) 'дробь - три четверти
'удаляем пустые параграфы
tmpstr = Replace(tmpstr,{<p><span style="padding:0px 10px;"></span></p>},"")
Strclean2 = tmpstr
Exit Function
ErrH:
Print "Библиотека 'MED_XML' ф-ция 'StrClean2'. Ошибка " & Error(Err) & " в строке " & Erl
End Function