5 mei 2007

Lotus domino data integreren in ODF




ODF

Het Open Document Format is een open standaard voor het bewaren en/of uitwisselen van tekstbestanden, rekenbladen, grafieken en presentaties.
Inmiddels zijn er meerdere software paketten op de markt die het ODF formaat ondersteunen en omarmen. Voorbeelden hiervan zijn:
OpenOffice
IBM productivity tools ( meegeleverd met Notes 8 )
etc

Technisch gezien is een ODF bestand een bestand dat gecomprimeerd is met het welbekend "zip" compressie algoritme. Een ODF bestand is dan ook te openen met WinZip, WinRar of aanverwante software.
In het gecomprimeerde bestand zitten een aantal xml bestanden die tesamen zorgdragen voor de vormgeving en inhoud van het ODF bestand.

Vanwege de architectuur van ODF is het karakter ervan erg open. Dat wil zeggen dat je met "normale" xml tools een ODF bestand kunt bewerken.
Dit laatste is erg belangrijk en geeft ontwikkelaars de kans documenten programmatisch aan te passen zonder gebruik te hoeven maken van "third party" software.

Voor Lotus Notes/Domino wil dat zeggen dat met de komst van ODF het mogelijk is geworden documenten te genereren met data uit Lotes Notes documenten zonder gebruik te hoeven maken van Microsft Word.
Hieronder is een implementatie beschreven van het opensource product JooReports. Dit product is een JAVA Api waarmee het op eenvoudige wijze mogelijk is data uit Lotus Notes te integreren met ODF bestanden.

Stap 1

Creeer een nieuw notes formulier en verrijk het formulier met een aantal velden voor datainput.



Stap 2

Voeg een berekenend veld toe met de volgende formule:




Stap 3

Creeer een ODF tekst bestand ( extensie is dan ODT ) met behulp van OpenOffice of bijvoorbeeld IBM Productivity Tools.
Voeg in het gemaakte bestand invoervelden toe op de plaatsen waar de Lotus Notes data ingevoegd moet worden.
Zorg ervoor dat het invoerveld een namgeving heeft conform de naamgeving van de gegenereerde xml.


Stap 4

Implemeteer op de Postsave van het formulier een javaagent die de xml integreerd met het ODT bestand, en vervolgens als attachment opslaat op het document.




Stap 5

Implementeer JooReports (http://jooreports.sourceforge.net/) in een javaagent .

public class CreateAndConvertDocument extends AgentBase{

public void NotesMain() {
Session session=null;
AgentContext agentContext = null;
Database db = null;
Document doc = null;
Item it = null;

try {
session = getSession();
agentContext = session.getAgentContext();
String id = agentContext.getCurrentAgent().getParameterDocID();
db = agentContext.getCurrentDatabase();
doc = db.getDocumentByID(id);
it = null;

if (doc!=null){
InputStream is = getTemplateInputStream( db, "sfrmAttachments" );
if (is!=null){
it = doc.getFirstItem("DataSrcXml");
if(it!=null ){
InputSource xml = it.getInputSource();
File outputFile = File.createTempFile("brief", ".odt");
outputFile.deleteOnExit();
DocumentTemplate template = null;
template = new ZippedDocumentTemplate(is);
Object model = null;
model = NodeModel.parse(xml);
template.createDocument(model, new FileOutputStream(outputFile));
is.close();
attachOutput( outputFile, doc);
doc.computeWithForm(true, false);
doc.save();
}
}
}

} catch(Exception e) {
e.printStackTrace();
}finally{
if(it!=null){try{it.recycle();}catch(Exception ex){}}
if(doc!=null){try{doc.recycle();}catch(Exception ex){}}
if(db!=null){try{db.recycle();}catch(Exception ex){}}
if(agentContext!=null){try{agentContext.recycle();}catch(Exception ex){}}
if(session!=null){try{session.recycle();}catch(Exception ex){}}
}
}

private static void attachOutput(File outputFile, Document doc) {
RichTextItem it = null;
EmbeddedObject eo = null;

try {
if( doc.hasItem("Attachments")){
it = (RichTextItem)doc.getFirstItem("Attachments");
Vector eos = it.getEmbeddedObjects();
String extNew = FilenameUtils.getExtension(outputFile.getName());

for( int i=0;i<eos.size();i++){
eo = (EmbeddedObject)eos.get(i);
String extOld = FilenameUtils.getExtension(eo.getName());
if(extNew.equalsIgnoreCase(extOld)){
eo.remove();
}
try{eo.recycle();}catch(Exception e){}
}
}else{
it = doc.createRichTextItem("Attachments");
}
it.embedObject(EmbeddedObject.EMBED_ATTACHMENT, "", outputFile.getAbsolutePath(), null);
} catch (NotesException e) {
e.printStackTrace();
}finally{
if(eo!=null){try{eo.recycle();}catch(Exception e){}}
if(it!=null){try{it.recycle();}catch(Exception e){}}
}

}

private static InputStream getTemplateInputStream(Database db, String templateName) {
NoteCollection nc = null;
Document doc = null;
EmbeddedObject eo = null;
try {
String id = "";
nc = db.createNoteCollection(false);
nc.selectAllDesignElements(true);
nc.buildCollection();
id = nc.getFirstNoteID();
while( !id.equals("") ){
doc = db.getDocumentByID(id);
if(doc!=null){
if(doc.hasItem("$TITLE")){
if(doc.getItemValueString("$TITLE").equalsIgnoreCase(templateName)){
eo = doc.getAttachment("brief-template.odt");
return eo.getInputStream();
}
}
}
id = nc.getNextNoteID(id);
}

} catch (NotesException e) {
e.printStackTrace();
}finally{
if(eo!=null){try{eo.recycle();}catch(Exception e){}}
if(doc!=null){try{doc.recycle();}catch(Exception e){}}
if(nc!=null){try{nc.recycle();}catch(Exception e){}}
}
return null;
}


Geen opmerkingen: