Hi Paulo,

I imagine that the problem has something to do with the container hosting
the web service.  The image location is given as a relative path which may
not resolve to where you think it does.  Perhaps try supplying an absolute
path to test this theory.  The answer may depend upon how you package your
web app - do you bundle the image as well?

Maybe try looking for IO related information in the web container
documentation.  If you are unable to solve the problem please send more
information about the environment that your code runs in.

I hope that helps,

Peter



On Thu, Feb 18, 2010 at 7:07 AM, Paulo Carvalho <pjcarva...@gmail.com>wrote:

> 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