# XML-Files in PDF konvertieren



## mathon (29. Nov 2006)

Hallo,

ich möchte gerne ein kleines Java-Programm schreiben, dass ein XML-File mit hilfe von XSL-FO in ein PDF-File konvertiert. Kennt dazu jemand gute Ressourcen im Netz oder weiß jemand womöglich ein einfaches tutorial dazu?

lg matti


----------



## Samson_Miller (29. Nov 2006)

Such mal nach "Apache FOP" Der Prozessor ist ganz gut dafür. So weit ich weiß ist auch ein Beispiel dabei wie du aus xml und xsl ein pdf machst.


----------



## mathon (1. Dez 2006)

hi,

danke erstmals für die antwort, habe mich da auch auf der Homepage umgesehen, aber bei den Examples kein vollständiges beispiel gefunden, wo ein xml-file angegeben wird bzw. auch ein xsl-fo file womit das xml-file dann in pdf konvertiert wird. hast du vielleicht genauere informationen dazu?

lg matti


----------



## Guest (4. Dez 2006)

mathon hat gesagt.:
			
		

> hi,
> 
> danke erstmals für die antwort, habe mich da auch auf der Homepage umgesehen, aber bei den Examples kein vollständiges beispiel gefunden, wo ein xml-file angegeben wird bzw. auch ein xsl-fo file womit das xml-file dann in pdf konvertiert wird. hast du vielleicht genauere informationen dazu?
> 
> lg matti



Hallo matti,

habe gerade mal ein kleines Beispiel für dich von mir rausgesucht. Vll hilft es dir weiter...
Weitere Fragen, sofern vorhanden, hier stellen.



```
/**
 * 
 */
package preprocessing;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.avalon.framework.logger.Logger;
import org.apache.fop.apps.Driver;
import org.apache.fop.messaging.MessageHandler;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.PatternLayout;


import core.DirectoryScanner;
import core.FileExtension;

/**
 * 
 * Erstellt aus allen in dem Verzeichnis angegeben xml-Dateien mit der xsl-Vorlage ein pdf-Dokument
 * 
 * 
 * @author Jan
 * @see StartPdfCreator
 * @see TestPdfCreator
 */
public class PdfCreator {
	
	private List<File> listFiles;
	private Driver driver;
	private File xslFile;
	private org.apache.log4j.Logger log;
	
	
	public PdfCreator(String directory, String xslFile){		
		this.setUpLogger();
		this.log.info("Lade Dateien des Verzeichnis \"" + directory + "\".");
		this.getFilesToConvert(new File(directory));
		this.log.info("Dateien des Verzeichnis geladen.");
		this.xslFile = new File(xslFile);
		this.driver = new Driver();
	}
	
	private void getFilesToConvert(File directory){
		DirectoryScanner scanner = new DirectoryScanner(FileExtension.XML);
		this.listFiles = scanner.getFilesFromDirectory(directory);		
	}
	
	private void setUpLogger() {
		try {
			this.log = org.apache.log4j.Logger.getRootLogger();
			PatternLayout layout = new PatternLayout( "%d{ISO8601} %-5p [%t] %c: %m%n" );
			DailyRollingFileAppender fileAppender =
			    new DailyRollingFileAppender( layout, "PdfCreator.log", "'.'yyyy-MM-dd_HH-mm" );
			this.log.addAppender(fileAppender);
			this.log.setLevel(Level.ALL);
		} catch (IOException e) {			
			e.printStackTrace();
		}
	}
	
	
	public void create() {
		// 09.11.2006 - 07:35:09 Jan: Logger
		Logger logger = new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG);		
		this.driver.setLogger(logger);
		MessageHandler.setScreenLogger(logger);
		// 09.11.2006 - 08:35:34 Jan: Ausgabe als PDF		
		this.driver.setRenderer(Driver.RENDER_PDF);
		
		// 09.11.2006 - 07:36:40 Jan: Transformer Factory
		TransformerFactory factory = TransformerFactory.newInstance();

		// 09.11.2006 - 08:33:47 Jan: Transformieren der XSL		
		Transformer transformer;
		try {
			transformer = factory.newTransformer(new StreamSource(this.xslFile));
				
			for (File file : this.listFiles) {
				try {
					String fileName = file.getName().replace("xml", "pdf");
					this.log.info("Verarbeite " + file.getAbsolutePath() + " zu PDF.");
					OutputStream out = new FileOutputStream(file.getParent() + "/" + fileName);
					this.driver.setOutputStream(out);
					Source source = new StreamSource(file);
					Result result = new SAXResult(this.driver.getContentHandler());
					transformer.transform(source, result);
					this.log.info("Verarbeitung von " + file.getAbsolutePath() + " erfolgreich.");
					out.close();
				} catch (TransformerException e) {
					e.printStackTrace();
					this.log.error("Verarbeitung von " + file.getAbsolutePath() + " fehlgeschlagen.");
					this.log.error(e.getMessage());
				} catch (FileNotFoundException e) {
					e.printStackTrace();
					this.log.error("Verarbeitung von " + file.getAbsolutePath() + " fehlgeschlagen.");
					this.log.error(e.getMessage());
				} catch (IOException e) {
					e.printStackTrace();
					this.log.error("Verarbeitung von " + file.getAbsolutePath() + " fehlgeschlagen.");
					this.log.error(e.getMessage());
				}
			}
			
			this.log.info("Verarbeitung der XML Dateien abgeschlossen.");
		
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
			this.log.fatal(e.getMessage());
			this.log.fatal("Die XSL Vorlage konnte nicht kompiliert werden. Bitte überprüfen!");
		}
	}

}
```


Grüße,

Jan


----------



## mathon (4. Dez 2006)

hi,

super danke für die antwort und den sample-code!!...ich weiß nicht ob ich es übersehen habe, aber auf der homepage vom apache fo project gibt es keine vollständigen examples mit ausgehendem xml-file und dem dazugehörigen xsl-fo file zur pdf-konvertierung oder? - ich habe nämlich immer nur das xsl-fo file gefunden...

lg matti


----------



## mathon (10. Dez 2006)

hat sich erledigt...habe die examples von apache fob verwendet


----------

