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_();
}
}