Главная Библиотека Шаблоны и примерыJava в Domino. Получение файловых элементов дизайна приложений Domino в виде потоковых данных
Николай Норкин
г. Киров
nickanor@mail.ru
Интересными для обработки программными средствами представляются файловые элементы дизайна приложений, размещённые в дизайне в виде файловых ресурсов и ресурсов картинок. Эти ресурсы можно использовать для обработки в качестве шаблонов либо частей для сборки документа (картинки использовать в качестве оформления рассылаемых почтовым роботом писем)
Для получения элементов дизайна приложения Lotus Notes/Domino используется класс стандартной библиотеки lotus.domino.NoteCollection
lotus.domino.NoteCollection notes = database.createNoteCollection(false);
notes.selectAllDesignElements(true);
notes.setSelectionFormula("(@Left($Flags; 6) = \"345CgQ\") & ($TITLE : $FileNames = \"".concat(filename).concat("\")"));
notes.buildCollection();
Таким способом можно получить ноту дизайна, хранящую файловый ресурс
А так - получить ноту,хранящую картинку
lotus.domino.NoteCollection notes = database.createNoteCollection(false);
notes.setSelectImageResources(true);
notes.setSelectionFormula("$TITLE : $ImageNames = \"".concat(image).concat("\""));
notes.buildCollection();
Дальнейшие шаги
- получить DXL-описание элемента дизайна
if(notes.getCount() < 1) return;
lotus.domino.DxlExporter exporter = session.createDxlExporter();
exporter.setOutputDOCTYPE(false);
exporter.setConvertNotesBitmapsToGIF(true);
String dxl = exporter.exportDxl(notes);
- получить xml-объект описания из строки dxl
javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document document = builder.parse( new java.io.ByteArrayInputStream(dxl.getBytes("UTF-8")));
- выделить base64-код содержимого файла
- вывести файл в поток
в данном проекте преобразование в массив байтов выполнено с помощью пакета com.ibm.xml
byte[] decodeBase64 = com.ibm.xml.enc.dom.Base64.decode(base64.getBytes());
java.io.ByteArrayInputStream stream = new java.io.ByteArrayInputStream(decodeBase64));
XML-структура файлового ресурса и картинки различна, поэтому описание, как выделить base64-код, приводится для обоих случаев раздельно
Получение base64-кода в dxl картинки
Обрабатывая объект org.w3c.dom.Document можно получить дополнительные сведения об элементе дизайна и файле картинки
org.w3c.dom.Node imageresource = null;
nodes = document.getElementsByTagName( "imageresource"); // информация об элементе дизайна
try {
imageresource = nodes.item(0);
try {
this.title = imageresource.getAttributes().getNamedItem("name").getNodeValue(); // название элемента дизайна
}
catch (Exception ex) {}
try {
this.alias = imageresource.getAttributes().getNamedItem("alias").getNodeValue(); // псевдоним
}
catch (Exception ex) {}
try {
this.comment = imageresource.getAttributes().getNamedItem("comment").getNodeValue(); // комментарий
}
catch (Exception ex) {}
}
catch (Exception ex) {}
try {
nodes = ((org.w3c.dom.Element) imageresource).getElementsByTagName("noteinfo");
node = nodes.item(0);
this.noteid = node.getAttributes().getNamedItem("noteid").getNodeValue(); // NoteID и UNID элемента дизайна
this.unid = node.getAttributes().getNamedItem("unid").getNodeValue();
}
catch (Exception ex) {}
try {
nodes = ((org.w3c.dom.Element) node).getElementsByTagName("modified");
node = nodes.item(0);
this.modified = this.toDate(node.getTextContent()); // дата-время изменения элемента дизайна
}
catch (Exception ex) {}
try {
nodes = ((org.w3c.dom.Element) imageresource).getElementsByTagName("item");
for (int i = 0; i < nodes.getLength(); i++) {
node = nodes.item(i);
if(node.getAttributes().getNamedItem("name").getNodeValue().equalsIgnoreCase("$MimeType"))
this.mimetype = node.getTextContent(); // тип файла
if(node.getAttributes().getNamedItem("name").getNodeValue().equalsIgnoreCase("$FileSize"))
this.filesize = Long.parseLong(node.getTextContent()); // и его размер
}
}
catch (Exception ex) {}
String base64 = this.findResource(imageresource); // Передаётся ветка тега imageresource
И, наконец, содержимое файла
protected String findResource(org.w3c.dom.Node imageresource) {
org.w3c.dom.NodeList nodes = null;
org.w3c.dom.Node node = null;
String resource = "";
try {
nodes = ((org.w3c.dom.Element) imageresource).getElementsByTagName("gif");
node = nodes.item(0);
resource = node.getTextContent();
}
catch (Exception ex) {}
if (!resource.equals("")) return resource;
try {
nodes = ((org.w3c.dom.Element) imageresource).getElementsByTagName("jpeg");
node = nodes.item(0);
resource = node.getTextContent();
}
catch (Exception ex) {}
return resource;
}
Получение base64-кода в dxl файлового ресурса
Для сокращения кода получение всех побочных параметров опущено. При необходимости можно будет полюбопытствовать в пакете, который будет приложен позднее отдельно
org.w3c.dom.Node fileresource = null;
org.w3c.dom.NodeList nodes = document.getElementsByTagName( "fileresource");
try {
fileresource = nodes.item(0);
}
catch (Exception ex) {}
String base64 = this.findResource(fileresource);
protected String findResource(org.w3c.dom.Node fileresource) {
org.w3c.dom.NodeList nodes = null;
org.w3c.dom.Node node = null;
String resource = "";
try {
nodes = ((org.w3c.dom.Element) fileresource).getElementsByTagName("filedata");
node = nodes.item(0);
resource = node.getTextContent();
}
catch (Exception ex) {}
return resource;
}
Благодарности
Автор выражает признательность Максиму Колосову за сохранение и поддержку проекта
Продолжение
Java в Domino. Вывод в поток присоединённых файлов
Java в Domino. Сохранение файлового потока в документе Notes
Пример обработки файловых потоков. Работа с бланком Microsoft Excel
|
Опубликовано — 01/17/2021 |
| |
|
|