我可以接触到Lotus Notes嵌入的文件,而无需实际提取呢?(Can I get access

2019-09-18 01:39发布

我工作的编程访问Lotus Notes数据库在一定时期内收集的记录的嵌入式附件信息的一种方式。

我的目标是要找到某个时间段内的记录,然后使用Apache的POI,以获取有关文件的大小,字符数,元数据等。

该POI部分工作正常,到目前为止,我已经能够访问Lotus Notes记录感谢这个帮助:

Lotus Notes的日期与Java API搜索

而这个问题的答案也说明我如何下载/复制附件:

我如何得到所有从.NSF附件(Lotus Notes)中使用的Java文件

从那里我可以用我的POI的代码做我的工作,到了最后,只是删除复制的附件。 这种做法,基本上工作,但我想避免复制的开销,节约型,然后在最后删除了我从数据库中,这些附加文件副本。

我想经过EmbeddedObject的getSource()方法的结果作为输入到我的POI的代码,并获得在期待一个字符串,使文件的POI代码FileNotFoundException异常。

有没有得到一个文件引用我可以传递给POI,而不复制和保存附件的方式? 或者说,我的意思是,它是那样简单获取文件(+路径)对Lotus Notes EmbeddedObject附件,我该怎么办呢?


我找到了答案,并张贴在下面。

Answer 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!


文章来源: Can I get access to Lotus Notes embedded files without actually extracting them?