Как извлечь значок базы данных Lotus Notes? - PullRequest
2 голосов
/ 23 марта 2012

Я пытался извлечь значок базы данных Lotus Notes с помощью DXL Exporter, но это не удалось. Файл результатов поврежден и не может быть открыт программой просмотра изображений.

Как извлечь значок базы данных Lotus Notes с помощью Java?

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;
}  

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Это даже не растровое изображение, это значок. Формат вы можете найти здесь: http://www.daubnet.com/formats/ICO.html

Мне удалось сделать это давным-давно в LotusScript. Мой код был основан на более ранней версии этой страницы: http://www2.tcl.tk/11202

Для самой иконки вам нужно открыть только один документ:

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

, а затем проанализируйте XML, чтобы найти необработанные данные из элемента IconBitmap, как вы делали в исходном коде.

1 голос
/ 24 марта 2012

Я не уверен, что формат.Насколько я знаю, это 16-цветное растровое изображение, но не в стандартном формате файла BMP.И это определенно не формат GIF, но вы можете указать DXLExporter преобразовать его.По умолчанию он остается родным, поэтому вам необходимо добавить его в код перед экспортом:

dxl.setConvertNotesBitmapsToGIF(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...