FOP liefert fehlerhafte PDF

Status
Nicht offen für weitere Antworten.

Shaddow

Mitglied
Hi, bin grad ne Weile am Rumbasteln mit FOP und bin inzwischen soweit, dass tatsächlich eine PDF generiert wird.
Mein PDFGenerator liefert keine Fehler, der Quellcode:
Java:
public class PDFGenerator 
{
	private static FopFactory fopFactory = FopFactory.newInstance();
	
	public static void convertXML2PDF(String xml, File xslt, File pdf)
			throws IOException, FOPException, TransformerException 
	{

		// Step 2: Set up output stream.
		// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams).
		OutputStream out = new BufferedOutputStream(new FileOutputStream(pdf));

        try 
        {
            //Setup XSLT
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer(new StreamSource(xslt));

            //Setup input for XSLT transformation
            Source src = new StreamSource(new StringReader(xml));

            //Resulting SAX events (the generated FO) must be piped through to FOP
            Result res = new StreamResult(out);

            //Start XSLT transformation and FOP processing
            transformer.transform(src, res);
        }
        finally 
        {
            out.close();
        }
	}
}
Aufruf:
Java:
    private File outDir = new File("out");
    private File xsltfile = new File("xml/xslt/style.xsl");
    private File pdffile = new File(outDir, "ResultObj2PDF.pdf");

			System.out.println(currentOffer.toXML());
			try{
			PDFGenerator.convertXML2PDF(currentOffer.toXML(), xsltfile, pdffile);
			}catch(Exception exc){
				System.err.println(exc.getMessage());
			}

getXML liefert (aus dem Beispiel von der Apache FOP Seite entwendet):
[xml]<name>Frank</name>[/xml]

die XSLDatei ist ebenso von der Seite übernommen:
[xml]<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl😱utput method="xml" indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait"
page-height="29.7cm" page-width="21.0cm" margin="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo😛age-sequence master-reference="A4-portrait">
<fo:flow flow-name="xsl-region-body">
<fo:block>
Hello, <xsl:value-of select="name"/>!
</fo:block>
</fo:flow>
</fo😛age-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>[/xml]

Die PDF wird wie gesagt generiert, aber kann nicht geöffnet werden. Hat da jemand eine Idee?
 
Java:
public class PDFGenerator
{
    // private static FopFactory fopFactory = FopFactory.newInstance();

    public static void convertXML2PDF(String xml, File xslt, File pdf)
        throws IOException, FOPException, TransformerException
    {

        OutputStream out = new BufferedOutputStream(new FileOutputStream(pdf));

        try
        {
            // Setup XSLT
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer(new StreamSource(xslt));

            // Setup input for XSLT transformation
            Source src = new StreamSource(new StringReader(xml));


            Driver driver = new Driver();
            driver.setRenderer(Driver.RENDER_PDF);
            driver.setOutputStream(out);

            // Resulting SAX events (the generated FO) must be piped through to FOP
            Result res = new SAXResult(driver.getContentHandler());

            // Start XSLT transformation and FOP processing
            transformer.transform(src, res);
        }
        finally
        {
            out.close();
        }
    }

    public static void main(String[] args)
        throws Exception
    {
        String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
        xml += "<name>Frank</name>";
        convertXML2PDF(xml, new File("test.xsl"), new File("result.pdf"));

    }
}

in das XML vielleicht so ein XML-Tag, obwohl es nicht notwendig scheint,
in die Hauptmethode habe ich von meiner funktionierenden Version den Driver kopiert
-> funktioniert bei mir
 
Diesen Treiber gibt es bei mir nicht. Der Import, wenn ich ihn manuell einfüge, ist fehlerhaft. In welcher jar liegt der?
 
Also ich habe inzwischen meinen PDF Generator zum Laufen bekommen, lediglich das zusammenspiel von XML und XSL will noch nicht ganz funktionieren:

Java:
public class PDFGenerator 
{
	private static FopFactory fopFactory = FopFactory.newInstance();
    private static FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
	
    //public static void convertXML2PDF(File xml, File xslt, File pdf)
	public static void convertXML2PDF(String xml, File xslt, File pdf)
			throws IOException, FOPException, TransformerException 
	{

		// Step 2: Set up output stream.
		// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams).
		OutputStream out = new BufferedOutputStream(new FileOutputStream(pdf));

		try {
			  // Step 3: Construct fop with desired output format
			  Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

			  // Step 4: Setup JAXP using identity transformer
			  TransformerFactory factory = TransformerFactory.newInstance();
			 // Source src = new StreamSource(xslt);

			  Transformer transformer = factory.newTransformer(new StreamSource(xslt)); // identity transformer
			 // Source src = new StreamSource(new StringReader(xml));         
			  Source src = new StreamSource(new StringReader(xml));
			  // Step 5: Setup input and output for XSLT transformation 
			  // Setup input stream

			  // Resulting SAX events (the generated FO) must be piped through to FOP
			  Result res = new SAXResult(fop.getDefaultHandler());
			            
			  // Step 6: Start XSLT transformation and FOP processing
			  transformer.transform(src, res);

			} finally {
			  //Clean-up
			  out.close();
			}
	}
}
Der aufruf erfolg über:
Java:
PDFGenerator.convertXML2PDF(currentModel.toXML(), xsltfile, pdffile);

XSL:
[xml]
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl😱utput method="xml" indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait"
page-height="29.7cm" page-width="21.0cm" margin="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo😛age-sequence master-reference="A4-portrait">
<fo:flow flow-name="xsl-region-body">
<fo:block>
Angebots-Nummer: <xsl:value-of select="offerID"/>!
</fo:block>
</fo:flow>
</fo😛age-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>[/xml]

und der Rückgabewert von currentModel.toXML()
[xml]
<offer>
<name>Frank</name>
<offerID>testid123</offerID>
</offer>[/xml]

Wenn ich nun das ganze ausführe entsteht eine PDF mit "Angebots-nummer: !"
Der select darin wird nicht ausgeführt, obwohl die ID existiert. Woran liegt das? Muss ich das irgendwie hierarchisch umsetzen, weil offerID in offer liegt?
 
Hallo,
ich möchte XSL-Fo mit Java benutzen und dafür brauche ich das Import von der Klasse "Driver" zu benutzen. Ich habe alle dazugehörige Jar-Dateien runtergeladen und anscheint kann keine die Klasse "Driver" importieren!
import org.apache.fop.apps.Driver;

hier ist den Link von alle mögliche Jar Dateien, die ich verwendet habe und haben aber keinen Erfolg für die Klasse "Driver" geliefert!!

Driver - JAR Search Engine - findJAR.com

--------
Also, ich brauche im Programm z.B. ein Objekt des Drivers einzubauen:
Driver driver = new Driver();

Für eine posetive Antwort werde ich sehr dankbar 🙂
schöne Grüße,
Hama
 
welche Jars hast du denn gedownloaded, gib z.B. die Quellen an,
in fop-0.20.5 sollte es dabei sein, in höheren evtl. nicht mehr,
müßte man auch wie ein Zip öffen und alle enthaltenen Klassen nachschauen können

ob dein Programm danach noch kompiliert ist eine ganz andere Frage,
hängt von tausend komplizierten Befehlen hab, schonmal eine externe Library engebungen?
Entwicklungsumgebung oder Konsole,

mehr Infos/ Screenshots?
 
> was für Probleme!
statt
was für Probleme?

heißt, dass keine Frage mehr offen ist?

ansonsten siehe:
ob dein Programm danach noch kompiliert ist eine ganz andere Frage,
hängt von tausend komplizierten Befehlen hab, schonmal eine externe Library engebungen?
Entwicklungsumgebung oder Konsole,

mehr Infos/ Screenshots?
dass du Java6 verwendest ist ziemlich wenig Info,
du hast doch ein Programm, ein Kompilier-Kommando, Anzeige der Fehlermeldung,
irgendwo muss das Jar sein, wie ist das eingebunden/ konfiguriert
usw. usf.

viele Sätze schreiben oder viele Screenshots

gut nacht für heute
 
Also, bis jetzt hatte ich nie solche Probleme bekommen...
Ich benutze eclipse und es zeigt Fehler wenn das Pacage der Klasse nicht richtig importiert ist.

danke!
 
dass du das Jar bei Eclipse-Projekten konfigurieren musst und ich nichts weiter machen kann bevor das nicht glaubhaft bewiesen ist, z.B. Screenshot, muss ich noch ein drittes Mal schreiben?

falls du nicht verstehst, worum es geht, wäre folgendes gefälliger formuliert:
'ich habe bisher folgendes Eclipse-Projekt, alles was ich zum Jar dort eingestellt habe ist: .. (evtl nichts außer Download),
was muss ich alles noch tun?'
das wäre zwar recht wenig Grundlage, aber zumindest muss ich dann nicht ständig nachfragen
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Zurück
Oben