我正在以编程方式访问Lotus Notes数据库,以收集有关给定时间段内记录的嵌入附件的信息。
我的目标是查找给定时期内的记录,然后使用Apache-POI获取有关文档大小,字符数等的元数据。
POI部分工作正常,到目前为止,由于这个帮助,我已经能够访问Lotus Notes记录了:
lotus notes search by date with Java api
这个答案还告诉我如何下载/复制附件:
How do I get all the attachments from a .nsf(lotus notes) file using java
从那里我可以使用我的POI代码完成我的工作,最后,只需删除复制的附件。这种方法基本上有效,但我希望避免复制,保存,然后最后从数据库中删除这些附加文档的副本的开销。
我尝试将EmbeddedObject getSource()方法的结果作为输入传递给我的POI代码,并在POI代码中得到一个FileNotFoundException,期望String生成一个文件。
有没有办法获取文件参考我可以传递给POI,而无需复制和保存附件?或者,我的意思是,它是否像获取Lotus Notes EmbeddedObject附件的文件(+路径)一样简单,我该怎么做?
我找到了答案并将其发布在下面。
答案 0 :(得分:1)
回答我自己的问题......
...这是我在发布上述问题后发现的解决方案:
EmbeddedObject的getInputStream救援......
//from the answer in the link in the question above
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 = embeddedObjs.elements();
while(e.hasMoreElements()){
EmbeddedObject eo = (EmbeddedObject)e.nextElement();
if(eo.getType() == EmbeddedObject.EMBED_ATTACHMENT){
//this next line gives Apache-POI access to the InputStream
InputStream is = eo.getInputStream();
POIFSFileSystem POIfs =
HWPFDocument.verifyAndBuildPOIFS(is);
POIOLE2TextExtractor extractor =
ExtractorFactory.createExtractor(POIfs);
System.out.println("extracted text: " + extractor.getText());
is.close(); //closing InputStream
}
eo.recycle(); //recycling EmbeddedObject
//thanks to rhsatrhs for the close() and recycle() tip!