2012-03-23 11 views
2

私はDXL Exporterを使用してLotus Notesデータベースアイコンを抽出しようとしましたが、それは成功しません。結果ファイルが壊れており、画像ビューアで開くことができません。ロータスノーツのデータベースアイコンを抽出するには?

Javaを使用してLotus Notesデータベースアイコンを抽出するにはどうすればよいですか?

private String extractDatabaseIcon() { 
    String tag = ""; 
    String idfile = ""; 
    String password = ""; 
    String dbfile = ""; 
    NotesThread.sinitThread(); 
    Session s = NotesFactory.createSessionWithFullAccess(); 
    s.createRegistration().switchToID(idfile, password); 
    Database d = s.getDatabase("", dbfile); 

    NoteCollection nc = d.createNoteCollection(false); 
    nc.setSelectIcon(true); 
    nc.buildCollection(); 
    String noteId = nc.getFirstNoteID(); 
    int counter = 0; 
    while (noteId != null) { 
     counter++; 
     try { 
      Document doc = d.getDocumentByID(noteId); 
      DxlExporter dxl = s.createDxlExporter(); 
      String xml = dxl.exportDxl(doc); 
      xml = xml.substring(xml.indexOf("<note ")); 
      org.jsoup.nodes.Document jdoc = Jsoup.parse(xml); 
      Element ele = jdoc.select("rawitemdata").first(); 
      String raw = ele.text().trim(); 
      String temp = System.getProperty("java.io.tmpdir") + UUID.randomUUID().toString() + "\\"; 
      File file = new File(temp); 
      file.mkdir(); 
      String filename = temp + UUID.randomUUID().toString().replaceAll("-", "") + ".gif"; 
      byte[] buffer = decode(raw.getBytes()); 
      FileOutputStream fos = new FileOutputStream(filename); 
      fos.write(buffer); 
      fos.close(); 
      tag = filename; 
     } catch (Exception e) { 
      logger.error("", e); 
     } 

     if (counter >= nc.getCount()) { 
      noteId = null; 
     } else { 
      noteId = nc.getNextNoteID(noteId); 
     } 
    } 
    return tag; 
} 

private byte[] decode(byte[] b) throws Exception { 
    ByteArrayInputStream bais = new ByteArrayInputStream(b); 
    InputStream b64is = MimeUtility.decode(bais, "base64"); 
    byte[] tmp = new byte[b.length]; 
    int n = b64is.read(tmp); 
    byte[] res = new byte[n]; 
    System.arraycopy(tmp, 0, res, 0, n); 
    return res; 
} 

答えて

3

。ここで見つけることができる形式: http://www.daubnet.com/formats/ICO.html

私はこのことを、以前はLotusScriptでやっていました。私のコードは、このページの以前のバージョンに基づいていました:

NotesDocument doc = db.getDocumentByID("FFFF8010") 
exporter = session.createDXLExporter 
exporter.setConvertNotesBitmapsToGIF(false) 
outputXML = exporter.export(doc) 

、その後IconBitmapからrawitemdataを見つけるために、XMLをパース: http://www2.tcl.tk/11202

アイコン自体のために、あなたは1つの文書のみを開く必要があります元のコードで行ったのと同じです。

+0

アイコンをディスクに保存するにはどうしたらいいですか? –

+0

stream.Open( "dbicon.ico"、 "Binary")とstream.write(...)を使用してください –

+0

アイテムからストリームを取得するには?私はitem.getInputStream()が見つかりましたが、ストリームは常に空です。 –

1

形式がわからない。私が知る限り、16色のビットマップですが、標準のBMPファイルフォーマットではありません。 GIF形式ではありませんが、DXLExporterに変換するよう伝えることができます。デフォルトでは、ネイティブにそれを残すことがあるので、エクスポートする前に、あなたのコードにこれを追加する必要があります。それは、それがアイコンでもビットマップであるされていない

dxl.setConvertNotesBitmapsToGIF(true); 
+0

私はdxl.setConvertNotesBitmapsToGIF(true)を試しましたが、成功していません。結果ファイルがまだ破損しています。 –

関連する問題