#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
}