СРОЧНО нужна помощь, экспорт фото из Lotus Notes Domino 5

Автор Тема: СРОЧНО нужна помощь, экспорт фото из Lotus Notes Domino 5  (Прочитано 30434 раз)

salavat

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
    • E-mail
В карточке сотрудинка есть поле "Foto" в которое по кнопке импортируются фотки:
@Command([EditGotoField];"foto") ;
@PostedCommand([FileImport])

Необходимо выгрузить все фотки из базы. Не могу достать их из этого поля.

Set Fotoitem = doc.GetFirstItem("Foto")

в отладчике:
EMBEDDEDOJECTS - пустое
TYPE - 1

помогите плиз...

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Добрый день!

Попробуйте пройтись по всем элементам документа, и, если имя елемента будет $FILE, то это вложенный файл. Далее фильтруйте по имени файла.

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
такая же задача: требуется выгрузить выбранные(помеченные) документы с помощью агента, причем каждая карточка выгружается в определенный каталог. База работает и написана на 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

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Картинки хранятся только в одном поле? или могут содержаться еще в каком-нибудь?
Расширения картинок известны?

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
Картинки хранятся только в одном поле "FOTO", причем в этом поле может быть несколько картинок.
Расширения картинок "jpg" - картинки с этим расширением загружались в документы.

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
Картинки попадают в поле FOTO по кнопке "Импорт картинки"
Текст: "Формула"
@Command([EditGotoField];"foto") ;
@PostedCommand([FileImport])

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Можно пройтись по всем элементам документа, и выбирать элементы с именем $FILE. Это будут вложенные файлы из всех полей.
Проверяйте имя файла на расширение JPG, это и будут искомые картинки.

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
Прошелся по всем элементым документа с именем "$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

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Так вам нужен сам файл JPG, хранящийся в документе? Или иконка приложения, с помощью которого может пользователь, сохранивший этот файл открыть его (тогда зачем это нужно)?

В строке проверяется поле "foto", сюда не попадут вложения, нужно проверять "$FILE":
If item.Name = "foto" Then

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
 :)

Я и проверял на "foto", и пробовал смотреть все элементы документа, но на элемент картинки так и не вышел  :-\

If item.Name = "$FILE" Then
сюда попадают сами файлы вложения, эти файлы я уже вытащил :)

А проблема в другом: помимо файлов вложения в документе есть еще фотографии, которые хранятся в непонятном формате и отображаются не как иконки файлов, а как фотография, причем в поле может быть несколько фотографий


ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Не понятно о чем идет речь:)
Вы можете выложить скриншот с примером?

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
Причем поля документа с с именем:
      $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"

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
На скрепке два примера:
1) Пример формы из дизайнера с двумя кнопками
- Импорт данных (с помощью этой кнопки запоняются фотографии)
Текст кнопки: (формула)
@Command([EditGotoField];"foto") ;
@PostedCommand([FileImport])

- кнопка нахдящееся в левом нижнем углу добавляет файлы
Текст кнопки:
@Command([EditGotoField];"dop3");
@Command([EditInsertFileAttachment])

2) 2-й файл - пример заполненной формы в режиме Lotus Notus

Картинки вложенные в поле foto и необходимо сохранить на диск с помощью агента  :)

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Обычным лотусскриптом не получится.
- Можно программно через С API.
- Можно форму через Web открыть, тогда в html-коде будет ссылка на картинку.
- Можно воспользоваться сторонним продуктом Midas Rich Text LSX, в котором есть метод ExportGraphic.
- Можно вручную скопировать картинку и сохранить:)

Irbis

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
    • E-mail
в 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