La création d'un modèle consiste à :
Pour effectuer ces tâches, RTFTemplate fournit une classe abstraite net.sourceforge.rtf.usecases.AbstractRTFUseCase que vous pouvez implémenter. Cette classe permet de :
ATTENTION, il n'est pas conseillé d'utiliser l'implémentation de cette classe dans votre application. Veuillez vous reportez à la section intégration de RTFTemplate pour plus d'information.
RTFTemplate fournit une distribution qui contient les cas d'utilisation de RTFTemplate (gérer les images, les sauts de pages...). Pour plus d'informations cliquez ici.
Avant d'implémenter cette classe vous devez créer votre contexte JAVA, autrement dit créer toutes vos classes JAVA POJO (Plain Old java Object) et collections de POJO. Ces classes définissent des getters/setters sur des types Simples (java.lang.String,...) ou sur d'autres POJO. Le contexte créé sera ensuite fusionné avec votre modèle source RTF.
Voici le code de cette classe et les méthodes principales que vous devez implémenter ou que vous pouvez utiliser : (Il existe d'autres méthodes qui vous permettent de configurer plus finement RTFTemplate.)
public abstract class AbstractRTFUseCase { /** * Run RTFTemplate for merging rtfSource with the context * putted with the method putContext which be must implement. * After execution of this method, files * rtfSource + ".<rtfTemplateImpl>.rtf" (RTF template implementation (vmRTFtemplate,...) and * rtfSource + ".out.rtf" (RTF final with values of the context) * will be generate. * @param rtfSource RTF source model. * @throws Exception */throws Exception */ protected final void run(String rtfSource) throws Exception { .... } /** * This method must be implement by class * wich manage your RTF model. * Put the context of your model * (eg : context("date", new Date()); ) * @param context IContext */ protected abstract void putContext(IContext context); /** * Return String XML Mergefields used in your context * and Bookmarks (for start and end loop) * @return */ public String getXMLFields() { .... } /** * Save XML fields available into file. * If force parameter is false, the file is * updated with new context (by keeping just * description) otherwise the file is * crushed with new context. * @param filename * @throws Exception */ protected void saveXmlFields(String filename, boolean force) throws Exception { .... } /** * set true if RTF with (velocity, freemarker,... macro) file must be generated * and false otherwise. * @param saveTransformedDocument */ public void saveTransformedDocument(boolean saveTransformedDocument) .... } /** * This value allow to group by content when there is PageBreak * in order to group by content. * @param groupByPerPageBreak */ protected void setGroupByPerPageBreak(int groupByPerPageBreak) { ... } }
Les méthodes qui doivent être obligatoirement implémentées sont :
Une fois que vous avez implémenté ces méthodes, vous pouvez utiliser les méthodes :
Voici un exemple de code d'implémentation de AbstractRTFUseCase :
public class RTFProjectTest extends AbstractUseCase { protected void putContext(IContext context) { /** * Context of simply POJO */ context.put("date", new Date()); context.put("project", new Project("Jakarta Velocity")); /** * Context of list of POJO */ List developers = new ArrayList(); Developer developer = new Developer("Will Glass-Husain", "wglass@apache.org"); developer.addRole("Java Developer"); developer.addRole("Release Manager"); .... context.put("developers", developers ); } public static void main( String[] args ) throws Exception { RTFProjectTest usecase = new RTFProjectTest(); usecase.run("usecases/project/project_model.rtf"); usecase.saveRTFVelocity(true); // Save RTF file with velocity macro // Display the XML fields System.out.println(usecase.getXMLFields()); // Save XML fields into project_model.fields.xml file with update description usecase.saveTransformedDocument("usecases/project/project_model.fields.xml" ,false); } }
Une fois le test lancé, le fichier XML qui contient les champs XML disponibles (*.fields.xml) project_model.fields.xml se générera.
Ce fichier XML peut être ensuite utilisé pour modéliser votre modèle RTF. ATTENTION ce fichier doit se terminer par fields.xml pour que vous puissiez l'utiliser avec MS Word.
Les noms des champs de fusion MERGEFIELD et de liens hypertextes HYPERLINK doivent respecter une certaine syntaxe. Ces noms de ces champs sont contenues dans le fichier XML des champs disponibles.
<?xml version="1.0" encoding="ISO-8859-1"?> <fields> <description><![CDATA[]]></description> <!-- Bookmark Pattern --> <bookmark> <type>START_LOOP</type> <name>START_LOOP_{i}</name> <description><![CDATA[]]></description> </bookmark> <bookmark> <type>END_LOOP</type> <name>END_LOOP_{i}</name> <description><![CDATA[]]></description> </bookmark> ... <mergefield> <list>true</list> <listInfo>$[developers].Email</listInfo> <name>$developers.Email</name> <description><![CDATA[]]></description> </mergefield> <mergefield> <list>true</list> <listInfo>$[developers].Name</listInfo> <name>$developers.Name</name> <description><![CDATA[]]></description> </mergefield> .... <mergefield> <list>false</list> <listInfo>$project.Name</listInfo> <name>$project.Name</name> <description><![CDATA[]]></description> </mergefield> <mergefield> <list>false</list> <listInfo>$date</listInfo> <name>$date</name> <description><![CDATA[]]></description> </mergefield> .... </fields>
Ce fichier XML contient les élements XML suivants :