Я новичок в 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
Это легко объяснить:
После 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
?