Esta es mi primera pregunta aquí, espero hacerlo bien. Lo siento por mi mal inglés por adelantado :)FOP: cómo especificar la ruta relativa de src de la imagen?
Estoy usando JSF 2.0 (Eclipse IDE) y estoy tratando de generar algunos archivos PDF utilizando Apache FOP 1.0.
Pude crear archivos PDF sencillos usando las instrucciones en Apache Fop site, pero no puedo insertar ninguna imagen desde la carpeta de mi aplicación. Mi estructura de carpetas es la siguiente: En mi WebContent aplicación tengo (entre demás) pdf_transform/XSLT/transformFile.xsl y pdf_transform/XSLT/logo.jpg
En transformFile.xsl tengo
<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>
pero cuando clik botón 'showPDF' en mi servlet, consigo archivo PDF sin imagen (todo lo demás está allí), y estos mensajes en la consola:
GRAVES: La Fuente que fue devuelto fr La resolución de URI om no contiene un InputStream para URI: logo.jpg 18 de noviembre de 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Imagen no encontrada. URI: logo.jpg. (No hay información de contexto disponibles)
me trató de usar 'logo.jpg' en lugar de url ('logo.jpg'), imagen poniendo en varios lugares dentro de la carpeta WebContent y el uso de navegación diferente (" ./ logo .jpg ") pero no funcionó.
Funciona bien si establezco la ruta absoluta (por ejemplo "d: /fop/images/logo.jpg") pero necesito resurces en mi aplicación.
Mientras buscaba, encontré que esto está relacionado con fopFactory.setURIResolver() y/o userAgent.setBaseURL(). Intentó algo con eso, pero no tuvo éxito.
Soy nuevo en JSF y FOP, y esta situación de imagen me ha estado molestando bastante tiempo. ¿Alguien puede ayudarme con esto, o al menos dirigirme a algún tutorial sobre "cómo configurar FOP para el uso relativo de la ruta"?
EDITAR: No quiero ninguna ruta de acceso absoluta y la aplicación debería funcionar independientemente de su ubicación en la computadora (para ser publicable). Mi búsqueda me dice que tiene algo que ver con la configuración de FOP, pero no sé cómo hacerlo :)
Gracias de antemano.
P.S. Este es el método que se llama para visualizar PDF:
public void printExchangeRateList(ActionEvent event) {
BufferedOutputStream output = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
String path = externalContext.getRealPath("/");
try {
response.reset();
response.setHeader("Content-Type", "application/pdf");
output = new BufferedOutputStream(response.getOutputStream(), 10240);
File xsltfile = new File(path+"/pdf_transform/xslt/transformFile.xsl");
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));
Source src = new DOMSource(makeXML()); // my method
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} finally {
if (output != null) output.close();
/*try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
} catch (Exception e) {
// TODO Auto-generated catch block
}
facesContext.responseComplete();
}
Gracias por su respuesta. Pero eso no es lo que estoy buscando. Cuando crea xml, la cadena "/ ruta/a/aplicación /" debe tener un aspecto similar a "C: \ Eclipse \ workspace \ myProject \ .. etc" (si lo estoy haciendo bien). Estoy haciendo que esta aplicación sea publicable y todos los datos xml e imágenes que estoy accediendo deben ser referenciados dentro del alcance de la aplicación (lo siento, no lo escribí explícitamente en mi pregunta, la editaré ahora). – Nikola