Как мне получить все вложения из файла .nsf (lotus notes) с помощью Java

#java #lotus-notes

#java #lotus-notes

Вопрос:

Следующие шаги :

В качестве образца взял обратную сторону моих lotus notes.nsf

А затем попытался прочитать вложения из sample.nsf

Фрагмент кода :

 Database db = session.getDatabase("","C:\Projects\NotesToJava\sample.nsf");
DocumentCollection dc = db.getAllDocuments();
Document doc = dc.getFirstDocument();

while (doc != null) {
    RichTextItem body = (RichTextItem) doc.getFirstItem("Body");

    if (body.getEmbeddedObject("Request.xlsx") != null)
         System.out.println("Found BPM_Dev_Access_Request.xlsx in "   doc.getItemValueString("Subject"));

    doc = dc.getNextDocument();
}
 

Ответ №1:

Нет необходимости использовать evaluate , посмотрите extractFile в справке Lotus Designer

Из справки Lotus:

 import lotus.domino.*;
import java.util.Vector;
import java.util.Enumeration;
public class JavaAgent extends AgentBase {
  public void NotesMain() {
    try {
      Session session = getSession();
      AgentContext agentContext = session.getAgentContext();
      // (Your code goes here) 
      Database db = agentContext.getCurrentDatabase();
      DocumentCollection dc = db.getAllDocuments();
      Document doc = dc.getFirstDocument();
      boolean saveFlag = false;
      while (doc != null) {
        RichTextItem body = 
        (RichTextItem)doc.getFirstItem("Body");
        System.out.println(doc.getItemValueString("Subject"));
        Vector v = body.getEmbeddedObjects();
        Enumeration e = v.elements();
        while (e.hasMoreElements()) {
          EmbeddedObject eo = (EmbeddedObject)e.nextElement();
          if (eo.getType() == EmbeddedObject.EMBED_ATTACHMENT) {
            eo.extractFile("c:\extracts\"   eo.getSource());
            eo.remove();
            saveFlag = true;
            }
        }
        if (saveFlag) {
          doc.save(true, true);
          saveFlag = false;
          }
        doc = dc.getNextDocument();
      }
    } catch(NotesException e) {
      System.out.println(e.id   " "   e.text);
      e.printStackTrace();
    }
  }
}
 

Комментарии:

1. @user1007180 Поэтому, пожалуйста, примите этот ответ как правильный. Таким образом, будущие читатели, такие как я, могут легко найти решение. 😉

2. Этот ответ основан на том, что вложения фактически находятся в теле. Это может быть не всегда, поскольку могут быть документы, у которых нет тела, но все еще есть вложения. Оценка — единственный способ, если это так.

Ответ №2:

Вам нужно извлекать вложения из каждого документа, в отличие от EmbeddedObjects. Что-то вроде этого:

 import java.util.Iterator;

import lotus.domino.*;

public final class DocAttachmentParser implements Iterator {

private Session s;
private Document doc;
private Double count ;
private Iterator attIterator = null;
public  Double getCount() {
    return count;
}
public  DocAttachmentParser(Session s, Document doc) throws NotesException {
        this.s  = s;
        this.doc = doc;
        if (s!=null amp;amp; doc !=null){
            this.count = (Double) s.evaluate("@Attachments", doc).elementAt(0);
            if (count.intValue() > 0){
                attIterator = s.evaluate("@AttachmentNames", doc).iterator();
                }
        }

}
    public boolean hasNext() {
        return count.intValue() > 0 ? attIterator.hasNext(): false;
    }

    public Object next() {
        return count.intValue() > 0 ? attIterator.next(): null;
    }
    private String nextAttName(){
        return count.intValue() > 0 ? attIterator.next().toString(): null;
    }

    public void remove() {
        if (count.intValue() > 0) attIterator.remove();
    }

    public String getAll(){

        StringBuilder sb = new StringBuilder();
        if (count.intValue()>0){

            while (hasNext()) {
                sb.append(nextAttName());
            }
        }

        return sb.toString();
    }

}
 

Комментарии:

1. Это должен быть принятый ответ. Работает во всех случаях.

Ответ №3:

Чтобы получить все вложения из документа notes, я написал этот метод (часть моего класса). Этот метод берет документ и извлекает вложение (форматированное текстовое поле) из документа Notes. Этот класс также поможет вам узнать, рассмотрим пример: в двух документах, если есть одно и то же вложение, извлекается только одно.

Здесь вам просто нужно установить «Путь к файлу», куда вы должны извлечь свое вложение.

 public boolean export(Document doc ) throws NotesException { 

if (doc.hasEmbedded()) {
        Vector<Item> allItems;
        allItems = doc.getItems();
        HashSet<String> attNames = new HashSet<String>();

        for (int i = 0; i < allItems.size(); i  ) {
            Item item = allItems.get(i);
            if (item.getType() == Item.RICHTEXT) {
                RichTextItem riItem = (RichTextItem) item;
                Vector emb = riItem.getEmbeddedObjects();
                String[] doublette = new String[emb.size()];
                Set<String> atts = new HashSet<String>();
                for (int j = 0; j < emb.size(); j  ) {
                    EmbeddedObject embObj = (EmbeddedObject) emb.get(j);
                    if (!attNames.contains(embObj.getName())) {
                        attNames.add(embObj.getName());
                        StringBuffer test = new StringBuffer(
                                embObj.getSource());
                        test.append('-');
                        test.append(embObj.getName());
                        test.append('-');
                        test.append(embObj.getFileSize());
                        String attDesc = test.toString();
                        if (atts.contains(attDesc)) {
                            doublette[j] = attDesc;
                        } else {
                            doublette[j] = "";
                            atts.add(attDesc);
                        }

                    } 

                }

                for (int j = 0; j < emb.size(); j  ) {
                    try {
                        EmbeddedObject embObj = (EmbeddedObject) emb.get(j);
                        String itemName = riItem.getName();
                        bOk = extractFile(embObj, itemName);
                        embObj.recycle();
                    } catch (NotesException e) {
                        bOk = false;
                        if (!"".equals(doublette[j])) {
                            bOk = true;
                            System.out.println(" duplicated attachment:")
                            log.append(doublette[j]);

                        }
                    }
                }
            }
        }



    }
   return bOk;
}

  private boolean extractFile(EmbeddedObject embObj, String itemName)
        throws NotesException {
    boolean bOk = true;
    if (embObj.getType() == EmbeddedObject.EMBED_ATTACHMENT) {

            String fileName = embObj.getName();      
                    String filePath = this.filesPath   fileName;
                    // Check if file already exists, then delete
                if (FileUtils.killFile(filePath, false, true, true)) {
                        embObj.extractFile(filePath);
                    } else {
                        bOk = false;
                        System.out.println(", error in kill: "   filePath);
                    }           
    }
    return bOk;
}
 

Ответ №4:

Простой способ получить все вложения из Lotus Notes с помощью Java.

 Document doc = dc.getFirstDocument();
for(var att :session.evaluate("@AttachmentNames", doc)){
    if (att == null || att.toString().isEmpty()) {
          continue;
   }
   EmbeddedObject eb = doc.getAttachment(att.toString());
   System.out.println(eb.getName());
   System.out.println(eb.getFileSize());
   eb.extractFile("a.txt");// give file name what u  want
}