Here's an example that converts a single apt input file into a fo document. To produce a pdf from the result using Apache FOP, see eg ExampleFO2PDF.
import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import org.apache.maven.doxia.module.apt.AptParser; import org.apache.maven.doxia.module.fo.FoSink; import org.apache.maven.doxia.module.fo.FoSinkFactory; import org.apache.maven.doxia.parser.ParseException; public class Apt2FO { public static void main(String[] args) { try { // Open input apt document: FileReader source = new FileReader( new File( "resources", "test.apt" ) ); // Create FO sink: OutputStream out = new FileOutputStream( new File( "output", "test.fo" ) ); FoSinkFactory factory = new FoSinkFactory(); FoSink fosink = (FoSink) factory.createSink( out ); // parse apt to fo: fosink.beginDocument(); AptParser parser = new AptParser(); parser.parse( source, fosink ); fosink.endDocument(); // close streams fosink.close(); source.close(); } catch ( ParseException e ) { e.printStackTrace(); } catch ( IOException e ) { e.printStackTrace(); } } }
If you want to parse several source documents into a single fo file, so you can generate a single pdf from multiple source files, you should use the FoAggregateSink. A simple example is outlined below, refer to the API docs for more information.
AptParser parser = new AptParser(); FoAggregateSink fosink = new FoAggregateSink( new FileWriter( new File( "out", "aggregate.fo" ) ) ); // getDocumentModel() should return a DocumentModel object fosink.setDocumentModel( getDocumentModel() ); fosink.beginDocument(); fosink.coverPage(); fosink.toc(); // first document FileReader source1 = new FileReader( new File( "resources", "test1.apt" ) ); fosink.setDocumentName( "doc1" ); fosink.setDocumentTitle( "Document 1" ); parser.parse( source1, fosink ); // second document FileReader source2 = new FileReader( new File( "resources", "test2.apt" ) ); fosink.setDocumentName( "doc2" ); fosink.setDocumentTitle( "Document 2" ); parser.parse( source2, fosink ); fosink.endDocument();
To compile and run the following example,
you need the following dependencies on your classpath
(numbers in brackets are tested versions).
Compile:
doxia-core (1.1.4), doxia-module-fo (1.1.1),
doxia-sink-api (1.1.4), doxia-logging-api (1.1.4).
Run:
commons-configuration (1.6), commons-lang (2.6),
plexus-utils (2.0.5), commons-collections (3.2.1),
commons-logging (1.1.1).
import java.io.File; import java.io.IOException; import org.apache.maven.doxia.module.fo.FoSinkFactory; import org.apache.maven.doxia.sink.Sink; public class TestPDF { public static void main( String[] args ) { FoSink sink = null; try { sink = (FoSink) new FoSinkFactory() .createSink( new File( "." ), "test.fo" ); sink.beginDocument(); populateSink( sink ); sink.endDocument(); } catch ( IOException ex ) { ex.printStackTrace(); } finally { if ( sink != null ) { sink.close(); } } } private static void populateSink( Sink sink ) { sink.head(); sink.title(); sink.text( "Title" ); sink.title_(); sink.author(); sink.text( "Author" ); sink.author_(); sink.date(); sink.text( "Date" ); sink.date_(); sink.head_(); sink.body(); sink.paragraph(); sink.text( "Hello world!" ); sink.paragraph_(); sink.body_(); } }