Attach файла с иконкой (back-end)

Есть ли решение на лотусскрипт, чтобы когда креплю аттач
Call rtitem.EmbedObject ( EMBED_ATTACHMENT, "", файлик)
иконка не становилась серым квадратиком?

ИЛи только цеплять целую библиотеку для этого?

Visual Basic:
Dim ses As New NotesSession
    Dim db As NotesDatabase
    
    Dim doc As NotesDocument
    
    ses.ConvertMIME = false
    
    Set db = ses.Currentdatabase
    
    Set doc = db.Createdocument()
    
    Dim body As NotesMIMEEntity, header As NotesMIMEHeader ,  child As NotesMIMEEntity
    Dim streamIn As NotesStream
    
    Dim z_data As String
    Dim Stream As NotesStream
    
    Set Stream = ses.Createstream()
    
    If Not Stream.Open("D:/Temp/excel.xlsx", "Binary") Then
        Error 5001, "stream not open"
    End If
    
    z_data = Stream.Readtext()
    
    Set body = doc.CreateMIMEEntity("Body")
    
    'Content Type
    Set header = body.CreateHeader("Content-Type")
    Call header.SetHeaderValAndParams({multipart/alternative;charset="UTF-8"})
    
    Set child = body.createChildEntity() 'ChildEntities are containers
    
    Set streamIn = ses.CreateStream 
    Call streamIn.WriteText(z_data)
    streamIn.Position = 0
    
    Set header = child.CreateHeader("Content-Type")
    Call header.SetHeaderVal("multipart/mixed")

    Set header = child.CreateHeader("Content-Disposition")
    Call header.SetHeaderVal("attachment; filename=excel.xlsx")

    Set header = child.CreateHeader("Content-ID")
    Call header.SetHeaderVal("excel.xlsx")
    
    Call child.setContentFromText(streamIn, {"application/octet-stream"}, ENC_IDENTITY_BINARY)
    
    Call doc.Closemimeentities(True)
    Call doc.Replaceitemvalue("Form", "rtItem")
    
    Call doc.save(True, false)
    
    ses.ConvertMIME = True
    
    Call Stream.Close()
    Call streamIn.Close()
 
  • Нравится
Реакции: seoman2
Что то не работает, даже сделал простейший тестовый пример, чтбы по кнопке в поле засунуть что то в миме в уи.
но не пашет. не понимаю почему.
 
Что то не работает, даже сделал простейший тестовый пример, чтбы по кнопке в поле засунуть что то в миме в уи.
но не пашет. не понимаю почему.
я не пробовал через UI делать, но возможно как раз дело в форме и в том, что на форме уже есть одноименное поле.
Вот только если есть UI док, то зачем программно на LS делать?
Можно сделать хот-спот или кнопку с формульным кодом:
Код:
@Command([EditGotoField];"Body");
@Command([EditInsertFileAttachment])
 
Если уже есть одноименное поле у doc - да, ошибка при вызове, так и указано в документации .
doc.CreateMIMEEntity("поле").

Я делаю переименование существующего аррача на LotusScript, всё ок - только иконочка исчезает.
Вот и думал через миме крепить обратно.

"я не пробовал через UI делать," - попробуйте? никак не получается. чтобы корректно.
пробую сначала закрыть док в уи...
Call doc.Save(True, True) скидывает содержимое NotesMIMEEntity в поле.
в общем пока никак (
 
ничего не происходит (
Visual Basic:
Sub Click(Source As Button)
On Error Goto ErrH
Dim session As New NotesSession, ws As New NotesUIWorkspace, db As NotesDatabase, sview As NotesView, dc As NotesDocumentCollection
Dim uidoc As NotesUIDocument, doc As NotesDocument
 
Set doc = ws.CurrentDocument.Document
Set uidoc=ws.CurrentDocument
Call uidoc.save
Dim result As Variant
Call uidoc.GoToField("Body2")
Macro$ = { @Command([EditInsertFileAttachment] ; "C:\\XML\\Инст.docx"; "1";  "0";   "0";     "0");     }
result = Evaluate(Macro$, doc)
Print "OK"
Exit Sub
 
вот это работает
Создал файл test.xlsx. После работы скрипта иконка файла в документе реально отображается, но сам файл по нормальному не вкладывается - занимает не 5 kb, каким должен быть файл, а какие-то жалкие крохи. В общем получившийся документ занимает около 800 байтов. При попытке открытия файла даблкликом Excel выдаёт сообщение "Excel cannot open the file 'test.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.". Предполагаю, что можно это доточить, но извлечь Base64-текст иконки файла всё равно не представляется возможным. И потом работать с этими данными программно далее очень неудобно.

Сколько не пытался работать с MIME, это всегда напоминает какие-то уж совсем жуткие танцы с бубном...

Как по мне, проще, как обычно, приатачить файл в поле временного документа, а потом в DXL подменить Base64-текст иконки файла. Его можно получить и помощью и отредактировать размер на нужный свойствами класса javax.swing.Icon. А в конце получившееся содержимое поля просто добавить к RichText-полю своего документа.
 
  • Нравится
Реакции: seoman2
Да, похоже что открытие не работает. я не вот чтобы проверял сильно работоспособность.
Ну что ж, был не прав. Подумаю еще, всё же интересно.
А так, вот тут можно отсюда начать
 
Я в прошлом своём проекте тоже что-то подобное писал. Там копировал нужное RichText-поле во временный документ, а уже его DXL разбирал. Это сильно ускоряло поиск, особенно если в документе несколько RichText-полей с вложениями или картинками.
 
Проблемы с изменением размера изображения (иконки). Способом, указанном выше, иконка для файла возвращается в размере 16x16, она превосходного качества. Но вот если её увеличивать, то качество сильно ухудшается. Если увеличивать в 2 раза (а это так и нужно, т.к. стандартная серая иконка при EmbedObject имеет размер 33x29), то каждая линия увеличивает толщину вдвое, - получается некрасиво.
Если вкладывать файл с помощью UI-механизма "File > Attach" или через MIME, то утолщение некоторых линий не происходит, и вообще иконка выглядит немного по другому, более детализирована, что ли. Такое ощущение, что где-то в системе (dll?) есть уже готовые изображения размером 32x32, и эти механизмы вложения вытягивают их. Но и алгоритм какой-то дополнительно также дорабатывает, т.к. ширина каждой иконки в пикселях изменяется от длины имени файла...

В общем вот пока параметры, которыми мне удалось достичь наиболее качественных иконок 32x32 (но они далеки от идеала):
  • увеличение размера ровно в 2 раза;
  • java.awt.Image.SCALE_REPLICATE - повторяет пиксели для заполнения пространства;
  • java.awt.image.BufferedImage.TYPE_INT_ARGB - гарантирует наличие альфа-канала, что даёт прозрачный фон;
  • java.awt.RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR - каждый выходной пиксель получает цвет ближайшего входного пикселя, без смешивания или усреднения.

Ещё попробую покопать в сторону поиска и вытягивания уже готовых иконок 32x32 и попытаться вытянуть изображение картинки из MIME.
Если кто-то что-то знает об этом, подскажите. Я в любом случае выложу весь код, как закончу.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab