0

我正在研究一种以编程方式访问 Lotus Notes 数据库的方法,以收集有关给定时期内记录的嵌入式附件的信息。

我的目标是查找给定时间段内的记录,然后使用 Apache-POI 获取有关文档大小、字符数等的元数据。

POI 部分工作正常,到目前为止,由于以下帮助,我已经能够访问 Lotus Notes 记录:

莲花笔记使用Java api按日期搜索

这个答案还向我展示了如何下载/复制附件:

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

从那里我可以使用我的 POI 代码完成我的工作,最后,只需删除复制的附件。这种方法基本上可行,但我想避免复制、保存然后最后从数据库中删除这些附加文档的副本的开销。

我尝试将 EmbeddedObject getSource() 方法的结果作为输入传递给我的 POI 代码,并在 POI 代码中得到一个 FileNotFoundException,它期望一个字符串来生成一个文件。

有没有办法获取我可以传递给 POI 的文件参考,而无需复制和保存附件?或者,我的意思是,它是否像获取 Lotus Notes EmbeddedObject 附件的文件(+路径)一样简单,我该怎么做?


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

4

1 回答 1

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!
于 2012-06-14T00:22:14.283 回答