如何使用java从.nsf(lotus notes)文件中获取所有附件

步骤如下:

把我的莲花笔记作为sample.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(); } 

无需使用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(); } } } 

为了从笔记文档中获取所有附件,我编写了这个方法(我的课程的一部分)。 此方法获取文档并从Notes文档中提取附件(富文本字段)。 这个类也帮助你知道考虑例子:在两个文件中,如果有相同的附件,它只提取一个。

在这里,您只需要设置“filePath”,您必须在其中提取附件。

 public boolean export(Document doc ) throws NotesException { if (doc.hasEmbedded()) { Vector allItems; allItems = doc.getItems(); HashSet attNames = new HashSet(); 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 atts = new HashSet(); 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; } 

您需要从每个文档中获取附件,而不是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(); } }