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