How do I get all the attachments from a .nsf(lotus notes) file using java

后端 未结 4 683
耶瑟儿~
耶瑟儿~ 2021-01-01 05:50

Steps followed :

Took a back of my lotus notes as sample.nsf

And then tried to read the attachments from the sample.nsf

Cod

相关标签:
4条回答
  • 2021-01-01 06:06

    Easy way to get all the attachments from Lotus Notes using 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
    }
    
    0 讨论(0)
  • 2021-01-01 06:07

    No need to use evaluate, look up the extractFile in the Lotus Designer Help

    From the Lotus help:

    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();
        }
      }
    }
    
    0 讨论(0)
  • 2021-01-01 06:15

    To get all attachment from a notes document then i wrote this method(part of my class). This method takes the document and extract the attachment(Rich Text field)from Notes Document. This class also help you to know consider Example: In two document if there is same Attachment it extracts only one.

    Here just you have to set "filePath" where you have to extract your attachment.

    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;
    }
    
    0 讨论(0)
  • 2021-01-01 06:29

    You need to get the attachments out of each document, as opposed to the EmbeddedObjects. Something like this:

    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 && 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();
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题