Форум продуктов IBM Lotus
Общие вопросы => Поддержка => Тема начата: salavat от 12 Август 2008, 14:01:47
-
В карточке сотрудинка есть поле "Foto" в которое по кнопке импортируются фотки:
@Command([EditGotoField];"foto") ;
@PostedCommand([FileImport])
Необходимо выгрузить все фотки из базы. Не могу достать их из этого поля.
Set Fotoitem = doc.GetFirstItem("Foto")
в отладчике:
EMBEDDEDOJECTS - пустое
TYPE - 1
помогите плиз...
-
Добрый день!
Попробуйте пройтись по всем элементам документа, и, если имя елемента будет $FILE, то это вложенный файл. Далее фильтруйте по имени файла.
-
такая же задача: требуется выгрузить выбранные(помеченные) документы с помощью агента, причем каждая карточка выгружается в определенный каталог. База работает и написана на Lotus Notus Domino R5
- выгрузить текстовые данные в Эксель; - это у меня получилось :)
- выгрузить вложенные файлы; (выгружаются в подкаталог) - и это у меня получилось :)
- выгрузить вложенные картинки. (выгружаются в другой подкаталог) - картинки, не получается ??? ??? ???
не могу достать картинки из поля
помогите плиз...
текст агента на LotusScript приведен, ниже
Sub Initialize
Dim ss As NotesSession
Dim ws As NotesUIWorkspace
Dim db As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim xl As Variant
Dim xlW As Variant
Dim strFile As String
Dim path As String
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
Dim sizeInBytes As Long
Dim x As Integer
Dim y As Integer
Dim outline As NotesOutline
Dim oe As NotesOutlineEntry
Set ss = New NotesSession
Set ws = New NotesUIWorkspace
Set db = ss.CurrentDatabase
Set docs = db.UnprocessedDocuments
Set doc = docs.GetFirstDocument()
For i = 1 To docs.Count
subString$ = "документ"
Set xl = Nothing
Mkdir "r:\F\" & i
path = "r:\F\" & i + "\"
'Выгрузка информации из документа в Excel (выгрузка поля FIO)
Set xl = CreateObject("Excel.Application")
If xl Is Nothing Then Exit Sub
Set xlW = xl.Workbooks.Add
xl.Rows( " 1:1" ).Select
Set doc = docs.GetNthDocument( i )
xlW.ActiveSheet.Cells( 2, 1 ) = doc.FIO(0) ' ФИО
Call xlW.SaveAs( path + "карточка" )
Call xlW.Close
'Выгрузка вложенных файлов из поля Comment
Set rtitem = doc.GetFirstItem("Comment")
If Not Isempty(rtitem.EmbeddedObjects) Then
If doc.HasEmbedded Then
Mkdir path & i + "B"
Forall o In rtitem.EmbeddedObjects
strFile = path & i + "B" & "\" & o.name
Call o.ExtractFile(strFile )
End Forall
End If
End If
'Выгрузка фотографий из поля FOTO
'...????? не могу достать картинки из поля
Next
End Sub
-
Картинки хранятся только в одном поле? или могут содержаться еще в каком-нибудь?
Расширения картинок известны?
-
Картинки хранятся только в одном поле "FOTO", причем в этом поле может быть несколько картинок.
Расширения картинок "jpg" - картинки с этим расширением загружались в документы.
-
Картинки попадают в поле FOTO по кнопке "Импорт картинки"
Текст: "Формула"
@Command([EditGotoField];"foto") ;
@PostedCommand([FileImport])
-
Можно пройтись по всем элементам документа, и выбирать элементы с именем $FILE. Это будут вложенные файлы из всех полей.
Проверяйте имя файла на расширение JPG, это и будут искомые картинки.
-
Прошелся по всем элементым документа с именем "$FILE", в этих элементах хранятся файлы (эксель, ворд, jpg и другие), а сами картинки (их эскизы видны в документе) в "$FILE" не попадают :-[.
а сами картинки получить не получилось, помогите плз .... :)
Текст приведен ниже:
Sub Initialize
Dim ss As NotesSession
Dim ws As NotesUIWorkspace
Dim db As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim xl As Variant
Dim xlW As Variant
Dim strFile As String
Dim path As String
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
Dim sizeInBytes As Long
Dim objectName As String
Dim counter As Integer
Dim outline As NotesOutline
Dim oe As NotesOutlineEntry
Set ss = New NotesSession
Set ws = New NotesUIWorkspace
Set db = ss.CurrentDatabase
Set docs = db.UnprocessedDocuments
Set doc = docs.GetFirstDocument()
For i = 1 To docs.Count
counter = 0
Forall item In doc.Items
If item.Name = "foto" Then
Messagebox "Item # " & counter & Chr(13) & "Item Name: " & item.Name & Chr(13) & "Item Type: " & Item.Type
'На экран выводится
'Item # 6
'Item Name: foto
'Item Type: 1
If ( item.Type = 1 ) Then
Messagebox item.ValueLength
'На экран выводится общая сумма всего места сколько занимаю все картинки в данном поле
End If
End If
counter=counter+1
End Forall
Next
End Sub
-
Так вам нужен сам файл JPG, хранящийся в документе? Или иконка приложения, с помощью которого может пользователь, сохранивший этот файл открыть его (тогда зачем это нужно)?
В строке проверяется поле "foto", сюда не попадут вложения, нужно проверять "$FILE":
If item.Name = "foto" Then
-
:)
Я и проверял на "foto", и пробовал смотреть все элементы документа, но на элемент картинки так и не вышел :-\
If item.Name = "$FILE" Then
сюда попадают сами файлы вложения, эти файлы я уже вытащил :)
А проблема в другом: помимо файлов вложения в документе есть еще фотографии, которые хранятся в непонятном формате и отображаются не как иконки файлов, а как фотография, причем в поле может быть несколько фотографий
-
Не понятно о чем идет речь:)
Вы можете выложить скриншот с примером?
-
Причем поля документа с с именем:
$FILE имеют тип ATTACHMENT (1084) means authors
foto - RICHTEXT (1) means rich text
Если перебирать вложения напрямую из поля foto
Set rtitem = doc.GetFirstItem("foto")
If Not Isempty(rtitem.EmbeddedObjects) Then
If doc.HasEmbedded Then
Forall o In rtitem.EmbeddedObjects
End Forall
End If
End If
или при непосредственном обходе всех элементов
counter = 0
Forall item In doc.Items
If item.Name = "foto" Then
Forall o In item.EmbeddedObjects
End Forall
End If
counter=counter+1
End Forall
Метод EmbeddedObjects выдает ошибку "Type mismatch"
-
На скрепке два примера:
1) Пример формы из дизайнера с двумя кнопками
- Импорт данных (с помощью этой кнопки запоняются фотографии)
Текст кнопки: (формула)
@Command([EditGotoField];"foto") ;
@PostedCommand([FileImport])
- кнопка нахдящееся в левом нижнем углу добавляет файлы
Текст кнопки:
@Command([EditGotoField];"dop3");
@Command([EditInsertFileAttachment])
2) 2-й файл - пример заполненной формы в режиме Lotus Notus
Картинки вложенные в поле foto и необходимо сохранить на диск с помощью агента :)
-
Обычным лотусскриптом не получится.
- Можно программно через С API.
- Можно форму через Web открыть, тогда в html-коде будет ссылка на картинку.
- Можно воспользоваться сторонним продуктом Midas Rich Text LSX, в котором есть метод ExportGraphic.
- Можно вручную скопировать картинку и сохранить:)
-
в Lotus Notes R5, выгрузить фотографии не получилось ... нашел версию 6 и пробую выгружать через DXLExporter
все картинки выгружаются нормально :) , кроме jpg ... если в поле 1 картинка, то выгружается нормально, если больше то функция виснит ... :(
Код агента на LotusScript:
Sub Initialize
' в предстовлении выбираем один документ
Dim ss As NotesSession
Dim ws As NotesUIWorkspace
Dim db As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim xl As Variant
Dim xlW As Variant
Dim strFile As String
Dim path As String
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
Dim sizeInBytes As Long
Dim objectName As String
Dim counter As Integer
Dim outline As NotesOutline
Dim oe As NotesOutlineEntry
Dim exporter As NotesDXLExporter
Dim out As String
Dim filenum As Integer
Dim p1 As Long
Dim p2 As Long
Dim cnt As Integer
Set ss = New NotesSession
Set ws = New NotesUIWorkspace
Set db = ss.CurrentDatabase
Set docs = db.UnprocessedDocuments
Set doc = docs.GetFirstDocument()
For i = 1 To docs.Count
'Mkdir "r:\F\" & i
'path = "r:\F\" & i + "\"
'' Set doc=ws.CurrentDocument.Document ' current document
'tempdir$=Environ("TEMP")
'tempdir$=tempdir$ & "\"
tempdir$="r:\F" & "\"
' выгружаем xml
Set exporter = ss.CreateDXLExporter
exporter.ConvertNotesBitmapsToGIF = True
out = exporter.Export(doc)
filenum = Freefile
Open tempdir$ & "out.xml" For Output As filenum
Print #filenum, out
Close filenum
' выгружаем картинки
' gif
p1=1
While p1>0
p2=0
p1 = Instr(p1+10, out, "<gif>", 5)
If p1>0 Then p2 =Instr(p1, out, "</gif>", 5)
If p2>0 Then
Print "Exporting"
filenum = Freefile
filepath$ = tempdir$ & cnt & ".gif"
Open filepath$ For Output As filenum
Print #filenum, Base64Decode(Mid$(out, p1+5, p2-p1-5))
Close filenum
cnt = cnt + 1
End If
Wend
' 'Notes bitmap
p1=1
While p1>0
p2=0
p1 = Instr(p1+10, out, "originalformat='notesbitmap'>", 5)
If p1>0 Then p2 =Instr(p1, out, "</gif>", 5)
If p2>0 Then
Print "Exporting"
filenum = Freefile
filepath$ = tempdir$ & cnt & ".gif"
Open filepath$ For Output As filenum
Print #filenum, Base64Decode(Mid$(out, p1+30, p2-p1-30))
Close filenum
cnt = cnt + 1
End If
Wend
' jpeg
p1=1
While p1>0
p2=0
p1 = Instr(p1+10, out, "<jpeg>", 5)
If p1>0 Then p2 =Instr(p1, out, "</jpeg>", 5)
If p2>0 Then
Print "Exporting"
filenum = Freefile
filepath$ = tempdir$ & cnt & ".jpg"
Open filepath$ For Output As filenum
Print #filenum, Base64Decode(Mid$(out, p1+6, p2-p1-6))
Close filenum
cnt = cnt + 1
End If
Wend
Next
End Sub
а вот собственно декодирование найденное в дебрях инета (работает правда жутко медленно, если кто оптимизирует....)
Function Base64Decode( base64String_o) As String
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim dataLength, sOut, groupBegin
Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
Dim Base64String
Dim i As Long
Dim s As String
Dim eval As Variant
'remove white spaces, If any
' Print "Base64: Removing Whitespaces #13 "
base64String = base64String_o
' Print "Base64: Removing Whitespaces #13 "
base64String = Replace(base64String, Chr$(13), "")
' Print "Base64: Removing Whitespaces #10 "
base64String = Replace(base64String, Chr$(10), "")
' Print "Base64: Removing Whitespaces #9 "
base64String = Replace(base64String, Chr$(9), "")
' Print "Base64: Removing Whitespaces #32 "
base64String = Replace(base64String, " ", "")
'The source must consists from groups with Len of 4 chars
dataLength = Len(base64String)
If dataLength Mod 4 <> 0 Then
Messagebox "Bad string length must be a multiple of 4"
Exit Function
End If
' Now decode each group:
Print "Base64: Converting... "
For groupBegin = 1 To dataLength Step 4
' If groupBegin Mod 25 =0 Then Print "Base64: Converting "+Cstr( groupBegin )
' Each data group encodes up To 3 actual bytes.
numDataBytes = 3
nGroup = 0
For CharCounter = 0 To 3
' Convert each character into 6 bits of data, And add it To
' an integer For temporary storage. If a character is a '=', there
' is one fewer data byte. (There can only be a maximum of 2 '=' In
' the whole string.)
thisChar = Mid(base64String, groupBegin + CharCounter, 1)
If thisChar = "=" Then
numDataBytes = numDataBytes - 1
thisData = 0
Else
thisData = Instr(Base64, thisChar) - 1
End If
If thisData = -1 Then
Messagebox " Bad character In Base64 string."
Exit Function
End If
nGroup = 64 * nGroup + thisData
Next
'Hex splits the long To 6 groups with 4 bits
nGroup = Hex(nGroup)
'Add leading zeros
nGroup = String(6 - Len(nGroup), "0") & nGroup
'Convert the 3 byte hex integer (6 chars) To 3 characters
pOut = Chr(Cbyte("&H" & Mid(nGroup, 1, 2))) + _
Chr(Cbyte("&H" & Mid(nGroup, 3, 2))) + _
Chr(Cbyte("&H" & Mid(nGroup, 5, 2)))
'add numDataBytes characters To out string
sOut = sOut & Left(pOut, numDataBytes)
Next
Base64Decode = sOut
End Function
-
нашел топик на туже тему, только по 6-й версии
http://forum.codeby.net/topic15853.html?hl=left-to-do
но, мл ... фотогррафии в формате jpg не выгружаются, если в поле находятся 2 и более фотографии