【问题标题】:How do I get all the attachments from a .nsf(lotus notes) file using java如何使用 java 从 .nsf(lotus notes) 文件中获取所有附件
【发布时间】:2011-10-21 13:36:59
【问题描述】:

后续步骤:

把我的莲花笔记的背面作为sample.nsf

然后尝试从sample.nsf中读取附件

代码 sn-p:

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();
}

【问题讨论】:

    标签: java lotus-notes


    【解决方案1】:

    无需使用evaluate,在 Lotus Designer 帮助中查找extractFile

    来自 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();
        }
      }
    }
    

    【讨论】:

    • @user1007180 所以请接受这个答案作为正确答案。这样,像我这样的未来读者可以轻松找到解决方案。 ;)
    • 这个答案依赖于附件实际上在正文中。情况可能并非总是如此,因为可能存在没有正文但仍有附件的文档。如果是这种情况,评估是唯一的方法。
    【解决方案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 && 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();
        }
    
    }
    

    【讨论】:

    • 这应该是被接受的答案。适用于所有情况。
    【解决方案3】:

    为了从笔记文档中获取所有附件,然后我编写了这个方法(我的课程的一部分)。 此方法获取文档并从 Notes 文档中提取附件(富文本字段)。此类还可以帮助您了解考虑示例:在两个文档中,如果有相同的附件,则仅提取一个。

    在这里你只需要设置“filePath”,你必须提取你的附件。

    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】:

      使用 Java 从 Lotus Notes 获取所有附件的简单方法。

      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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多