Ошибка Lotus Notes Java API с кодировкой - PullRequest
0 голосов
/ 14 октября 2019

Я новичок в Java, и мне нужно извлечь данные из NSF файлов в DXL XML-файлы. Я пробовал это на python, но OLE-оболочка не имеет нескольких основных функций. У меня есть два разных формата DXL файлов: с rawitemdata и с richtext.

Когда я переключаюсь на Java Lotus Notes API, я получаю ошибки в полях rawitemdata. Я использую процедуру doc.convertToMIME(2);, чтобы предоставить почтовое тело в формате HTML для получения одинаковости для каждого типа документов. В результате все поля хранятся как rawitemdata, и это здорово. Это то, что я хочу. Но в некоторых rawitemdata полях произошла ошибка кодировки.

Это выглядит как

<rawitemdata type="19">
AgAPAAAAAgAmAj4AhQEAAAAAAAANCi0tMF9fPUNDQkIwRTFFREZBRjk4Mjg4ZjllOGE5M2RmOTM4NjkwOTE4Y0NDQkIwRTFFREZBRjk4
MjgNCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeQ0KQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07
IA0KCW5hbWU9Ij0/S09JOC1SP0I/OFBMdjlPL3I3K3d1Wkc5amVBPT0/PSINCkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7
IGZpbGVuYW1lPSI9P0tPSTgtUj84UEx2OU8vcjcrd3VaRzlqZUE9PT89Ig0KQ29udGVudC1JRDogPDNfXz1DQ0JCMEUxRURGQUY5ODI4
OGY5ZThhOTNkZjkzODY5MDkxQGxvY2FsPg0KDQoFzwXQBc4F0gXOBcoFzgXLLmRvY3g=
</rawitemdata>

После декодирования из base64 Я получил это

\x02\x00\x0f\x00\x00\x00\x02\x00&\x02>\x00\x85\x01\x00\x00\x00\x00\x00\x00\r\n-
-0__=CCBB0E1EDFAF98288f9e8a93df938690918cCCBB0E1EDFAF9828\r\nContent-Transfer-Encoding: 
binary\r\nContent-type: application/octet-stream; \r\n\tname="=?KOI8-R?B?8PLv9O/r7+wuZG9jeA==?
="\r\nContent-Disposition: attachment; filename="=?KOI8-R?8PLv9O/r7+wuZG9jeA==?="\r\nContent-ID: 
<3__=CCBB0E1EDFAF98288f9e8a93df93869091@local>\r\n\r\n\x05\xcf\x05\xd0\x05\xce\x05\xd2\x05\xce\x05\xca\x
05\xce\x05\xcb.docx

Это легко объяснить:

  • первые 20 байтов это заголовок: \x02\x00\x0f\x00\x00\x00\x02\x00&\x02>\x00\x85\x01\x00\x00\x00\x00\x00\x00

    чтобы распаковать его, я использую следующий код struct.unpack("<hhhh hhLL", data[:20]) он возвращает кортеж какэто: (2, 15, 0, 2, 550, 62, 389, 0) где 5-й элемент это длина тела. Но я изменил тело и поленился вычислить текущий заголовок для нового тела

  • тело с заголовками rfc822

После base64 , а затем koi8-r header Content-Disposition декодированный, мы могли видеть поле name с содержимым ПРОТОКОЛ.docx. И это правильное содержание.

Если я попытаюсь декодировать последнюю часть тела, которая содержит байт-кодировку \x05\xcf\x05\xd0\x05\xce\x05\xd2\x05\xce\x05\xca\x 05\xce\x05\xcb.docx, я получил исключение. Эта часть не может быть правильно декодирована. Это похоже на кодировку cp1251 в unicode . Поскольку содержимое ПРОТОКОЛ.docx в cp1251 кодовой странице имеет байты '\ xcf \ xd0 \ xce \ xd2 \ xce \ xca \ xce \ xcb.docx'.

Мой код Java довольно прост:

import lotus.domino.Database;
import lotus.domino.Session;
import lotus.domino.NotesFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;

import lotus.domino.*;

public class ExportDXL {

    public static void main(String[] args) throws Exception {
        String server = "";
        String dbPath = "C:\\share\\test.nsf";

        NotesThread.sinitThread();
        Session session = NotesFactory.createSession((String)null, (String)null, "test");

        Database db = session.getDatabase(server, dbPath);
        System.out.println("Db Title: " + db.getTitle());
        DxlExporter exporter = session.createDxlExporter();
        exporter.setConvertNotesBitmapsToGIF(true);

        View view = db.getView("$ALL");

        Document doc = view.getFirstDocument();

        while(doc != null){
            doc.convertToMIME(2); // or set 1 for get plain text

            String xmldoc = doc.generateXML();

            FileWriter fw = null;
            String id = doc.getUniversalID();
            fw = new FileWriter("C:\\lotus_test\\"+ id +".xml");
            fw.write(xmldoc);
            fw.flush();
            fw.close();

            doc = view.getNextDocument(doc);

        }
    }
}

Как обеспечить правильную кодировку в этом случае? Или как установить кодовую страницу для Lotus Notes API?

...