Abstract :
Simple guide to a use Venus XML Doc Format together with Apache FreeMarker
Author : Matteo Franci a.k.a. Fugerit (fugerit79)
Version : 001 (2023-10-14)
Quickstart :
Run the junit : src/test/java/test/org/fugerit/java/doc/guides/fulldocument/fm/facade/TestFullDocumentFmFacade.java
Guide :
For dependency handling we set the parent pom to fj-doc
<parent>
<groupId>org.fugerit.java</groupId>
<artifactId>fj-doc</artifactId>
<version>${fj-doc-version}</version>
<relativePath></relativePath>
</parent>
Minimum java 11 version (most modules works with java 8 too)
<properties>
<maven.compiler.release>11</maven.compiler.release>
<fj-doc-version>${project.parent.version}</fj-doc-version>
</properties>
And the module for rendering PDF through FOP (It will all other modules as transient dependencies)
<dependency>
<groupId>org.fugerit.java</groupId>
<artifactId>fj-doc-mod-fop</artifactId>
</dependency>
This will be the template full-document.ftl
It will generate a XML document which adheres to doc xsd
This is a simple facade FullDocumentFmFacade which will just :
private static final FreemarkerDocProcessConfig SIMPLE_CONFIG =
// SafeFunction.get() will execute the configuration code and re-throw a ConfigRuntimeException if any exception is thrown
SafeFunction.get( () -> FreemarkerDocProcessConfigFacade.newSimpleConfig( "A003-sample-config" , "/fj-freemarker-sample-template/" ) );
private static final List<MapEntry<String, String>> LIST_TESTS = Arrays.asList(
new MapEntry<>( "ul", "default unordered list"),
new MapEntry<>( "uld", "dotted unordered list"),
new MapEntry<>( "ulm", "square unordered list"),
new MapEntry<>( "ol", "default ordered list"),
new MapEntry<>( "oll", "letter ordered list"),
new MapEntry<>( "oln", "numbered ordered list")
);
public void generateFullDocument( OutputStream os, DocTypeHandler handler, List<UserData> listUsers ) throws DocException {
// wraps any exception as a DocException
DocException.apply( () -> {
DocProcessContext context = DocProcessContext.newContext( "listUsers", listUsers );
context.setAttribute( "listTests" , LIST_TESTS );
SIMPLE_CONFIG.fullProcess( "full-document", context, handler, DocOutput.newOutput(os) );
} );
}
This is a simple JUnit to activate the code TestFullDocumentFmFacade , it will :
target/
directory // three formats will be rendered in this example
private static final DocTypeHandler[] HANDLERS = {
PdfFopTypeHandler.HANDLER, // PDF through Apache FOP
FreeMarkerFopTypeHandler.HANDLER_UTF8, // XLS-FO format
FreeMarkerHtmlTypeHandlerEscapeUTF8.HANDLER, // HTML through Apache FreeMarker
DocTypeHandlerXMLUTF8.HANDLER }; // XML as source fugerit doc format XML
@Test
public void testFullDocument() throws IOException, DocException {
// custom data to be added to the template via Apache FreeMarker
List<UserData> listUsers = Arrays.asList(
new UserData( "Marie" , "Curie", ">> Checmist"),
new UserData( "Alan" , "Turing", "<IT/> Specialist")
);
for ( DocTypeHandler handler : HANDLERS ) {
File outputFile = new File( "target", "full-document."+handler.getType() ); // output file
log.info( "outputFile : {}", outputFile );
try ( OutputStream os = new FileOutputStream( outputFile ) ) {
FullDocumentFmFacade facade = new FullDocumentFmFacade(); // the facade to generate the document
facade.generateFullDocument(os, handler, listUsers); // actual document generation
log.info( "Generated full documenti pdf file in path : {}", outputFile.getCanonicalPath() );
Assert.assertTrue( outputFile.exists() );
}
}
}
If everything worked fine, in the path target/full-document.pdf it will be possible to find the generated document. (together with html, fo and xml format).
Note about DocTypeHandlerXMLUTF8 handler : this can be used to inspect the Venus XML Doc format after Apache FreeMarker substitution.
If you find any problem, you can submit an issue on the on this project github repository https://github.com/fugerit-org/fj-doc-guides