XML-Files in PDF konvertieren

Status
Nicht offen für weitere Antworten.

mathon

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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
 
G

Guest

Gast
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.


Code:
/**
 * 
 */
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

Bekanntes Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben