# FOP liefert fehlerhafte PDF



## Shaddow (5. Jun 2009)

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:

```
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:

```
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">
  <xslutput 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>
      <foage-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>
            Hello, <xsl:value-of select="name"/>!
          </fo:block>
        </fo:flow>
      </foage-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?


----------



## SlaterB (5. Jun 2009)

```
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


----------



## Shaddow (5. Jun 2009)

Diesen Treiber gibt es bei mir nicht. Der Import, wenn ich ihn manuell einfüge, ist fehlerhaft. In welcher jar liegt der?


----------



## SlaterB (5. Jun 2009)

ich benutze fop-0.20.5

Driver (Fop API)


edit:
in deiner Version musst du vielleicht etwas mit der FopFactory machen, siehe z.B.

Getting Apache FOP to work : fopfactory, fop, jsp
(nur den Code im ersten Posting)


----------



## Shaddow (20. Jun 2009)

Also ich habe inzwischen meinen PDF Generator zum Laufen bekommen, lediglich das zusammenspiel von XML und XSL will noch nicht ganz funktionieren:


```
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:

```
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">
  <xslutput 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>
      <foage-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>
      </foage-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?


----------



## hama (1. Nov 2009)

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


----------



## SlaterB (2. Nov 2009)

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?


----------



## hama (2. Nov 2009)

Hi,
ich habe alle diese Jar-dateien verwendet!

fop-0.20.3.jar
fop-0.20.4.jar
fop-0.20.5.jar
fop-0.20.5rc2.jar
fop-0.20.5-rc3-alpha.jar

Aber keine von denen kann die Klasse Driver liefern!

hier ist den Link: (schau bitte den Link)
Driver - JAR Search Engine - findJAR.com

danke


----------



## SlaterB (2. Nov 2009)

der Link sagt dass die Datei drin ist, warum soll ich ihn mir anschauen? (was ich eh gemacht habe)
ein wahlloser Link von dort führt zu
http://mirrors.ibiblio.org/pub/mirrors/maven/fop/jars/fop-0.20.5.jar

und auch da ist die Klasse natürlich drin


wie gesagt hast du wahrscheinlich andere Probleme


----------



## hama (2. Nov 2009)

oder hier!
Fop - JAR Search Engine - findJAR.com


----------



## hama (2. Nov 2009)

was für Probleme!
ich arbeite unter Java 6  also,   jdk 6.0


----------



## SlaterB (2. Nov 2009)

> was für Probleme!
statt
was für Probleme?

heißt, dass keine Frage mehr offen ist?

ansonsten siehe:


SlaterB hat gesagt.:


> 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


----------



## hama (2. Nov 2009)

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!


----------



## SlaterB (2. Nov 2009)

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


----------

