【问题标题】:Can I get access to Lotus Notes embedded files without actually extracting them?我可以在不实际提取 Lotus Notes 嵌入文件的情况下访问它们吗?
【发布时间】:2014-07-11 11:22:34
【问题描述】:

我正在研究一种以编程方式访问 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,它期望一个字符串来生成一个文件。

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


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

【问题讨论】:

  • 嘿,回答我自己的帖子可能是一种糟糕的形式,但我只是在 embeddeObject 中使用 getInputStream() 获得了一些运气。我将使用我几乎可以工作的解决方案编辑原始帖子。
  • POI 会非常愉快地从 InputStream 中打开东西,当您尝试这样做时,有什么不适合您?
  • @grooble,回答你自己的帖子是非常好的形式。我认为 getInputStream 是理想的解决方案是正确的:publib.boulder.ibm.com/infocenter/domhelp/v8r0/…
  • @grooble - 您应该将您的答案作为答案发布,然后接受它作为答案。你会因为这样做而获得一枚徽章(也许是银色的)!我们都需要徽章......
  • EmbeddedObject.getInputStream() 方法实际上在磁盘上保存了一个临时文件,然后为您打开它,因此您的代码并没有真正节省任何运行时开销。另外,要非常小心,因为除非您做两件事,否则临时文件将留在磁盘上:a) 关闭 InputStream,b) 回收 EmbeddedObject。如果您对大量文档执行此操作,则可能会耗尽磁盘空间。所以你需要分配InputStream stream = eo.getInputStream(),然后调用verifytAndBuildPOIFS(stream),然后当一切都完成后你需要调用stream.close()和eo.recycle()。

标签: java apache-poi lotus-notes


【解决方案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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多