Hello

I used a simple example on the Internet about how to use FOP in java (
http://javaboutique.internet.com/tutorials/FOP/):

  - I Created a simple Java application with a class that takes an XML and
converts it into a PDF (using a XSL) containing an image. The name of my
class is Process.java and it has a method "process". It works fine when
called directly as a java application.

  - I Created a simple web service that just call this "process" method of
that class. However, when i call the web service, i get an error:
"[ERROR] Image not found: img/logo.gif"
 => The PDF is created but without the image.

Here is the code of my Process.java class:

  public static String process(String xml, String xsl) {
 String sResult = null;
  try {

ByteArrayOutputStream foOut = new ByteArrayOutputStream();
 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
InputStream iss =
Process.class.getClassLoader().getResourceAsStream(brique);
 copyFile(new BufferedInputStream(iss), bOut);
 SAXBuilder builder = new SAXBuilder();
 Document document = builder.build(new
ByteArrayInputStream(xml.getBytes()));
 TransformerFactory factory = TransformerFactory.newInstance();
InputStream iXsl = Process.class.getClassLoader().getResourceAsStream(xsl);
 StreamSource iSource = new StreamSource(iXsl);
 Transformer foTrans = factory.newTransformer(iSource);
 StreamSource strSourceXML = new StreamSource(new
ByteArrayInputStream(xml.getBytes()));
 foTrans.transform(strSourceXML, new StreamResult(foOut));
foOut.flush();
 ByteArrayOutputStream pdfOut = new ByteArrayOutputStream();
TransformerFactory tFactoryFO2PDF = TransformerFactory.newInstance();
 Transformer pdfTrans = tFactoryFO2PDF.newTransformer();
FopFactory fopFactory = FopFactory.newInstance();
 FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, pdfOut);
 Result res = new SAXResult(fop.getDefaultHandler());
StreamSource streamSourceXml = new StreamSource(new
ByteArrayInputStream(foOut.toByteArray()));
 pdfTrans.transform(streamSourceXml, res);
 java.io.File file = new java.io.File("d:/res.pdf");
 FileOutputStream foStream = new FileOutputStream(file);
pdfOut.writeTo(foStream);
  } catch(Exception e) {
 e.printStackTrace();
}
 return sResult;
}
private static boolean copyFile(InputStream in, OutputStream out) {
 try {

int c;
while ((c = in.read()) != -1)
 out.write(c);

in.close();
out.close();
 } catch (IOException io) {
return false;
}
 return true;
}


The code of my web service is just:

public static String process(String xml, String xsl) {
 String sResult = null;
 try {
 sResult = Process.process(xml, xsl);
System.out.println("sss");
 } catch(Exception e) {
e.printStackTrace();
}
 return sResult;
}

The web service has the JAR of the Java application in his classpath. The
content of the Jar file is the following one:
      Name            Path
briques.xsd
logo.gif                 img\
Manifest.mf          meta-inf\
Process.class      tst
saxon-licence.lic
xsl2.xslt

I call the web service with the following parameters:

xml = "<?xml version='1.0' encoding='UTF-8'?>"+
 "<Catalog>"+
 "<Book>"+
"<Title>Mastering EJB</Title>"+
 "<Author>Ed Roman</Author>"+
"<Price>$45.00</Price>"+
 "</Book>"+
"<Book>"+
"<Title>Design Patterns</Title>"+
 "<Author>Erich Gamma</Author>"+
"<Price>$50.00</Price>"+
 "</Book>"+
"<Book>"+
"<Title>Effective Java</Title>"+
 "<Author>Josch Bloch</Author>"+
"<Price>$30.00</Price>"+
 "</Book>" +
"</Catalog>";

xsl = "xsl2.xslt";

In the xsl2.xslt I have a part of code like this to insert the image on the
pdf:
...
<fo:block>
  <fo:external-graphic src="img/logo.gif"/>
</fo:block>
...


The XSL is found in the JAR because the PDF file is generated. But the
following error still appearing and the image is not inserted on the PDF:
[ERROR] Image not found: img/logo.gif

What am I doing wrong?

Thanks
Regards

-- 
Paulo Carvalho
1 rue du Chateau
57710 Aumetz
France
http://forum-informatico.forumeiros.com/index.htm
http://ummundoecologico.blogspot.com

Reply via email to