我是否可以访问Lotus Notes嵌入式文件而无需实际提取它们?

时间:2012-06-13 04:14:26

标签: java apache-poi lotus-notes

我正在以编程方式访问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附件的文件(+路径)一样简单,我该怎么做?


我找到了答案并将其发布在下面。

1 个答案:

答案 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!