Questa è la mia prima domanda qui, spero di farlo bene. Scusa per il mio cattivo inglese in anticipo :)FOP: come specificare il percorso relativo dell'immagine src?
Sto usando JSF 2.0 (Eclipse IDE) e sto provando a generare alcuni file PDF usando Apache FOP 1.0.
Sono stato in grado di creare semplici file PDF utilizzando le istruzioni su Apache Fop site, ma non riesco a inserire alcuna immagine dalla cartella dell'applicazione. La mia struttura di cartelle è come questo: Nella mia applicazione WebContent ho (tra gli altri) pdf_transform/XSLT/transformFile.xsl, e pdf_transform/XSLT/logo.jpg
In transformFile.xsl devo
<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>
ma quando il pulsante 'showPDF' nel mio servlet i clik, ottengo file PDF senza immagine (tutto il resto è lì), e questi messaggi in console:
GRAVI: The Source che è stato restituito fr La risoluzione URI om non conteneva un InputStream per URI: logo.jpg 18 Nov, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Immagine non trovata. URI: logo.jpg. (Nessuna informazione contesto disponibili)
ho cercato di usare 'logo.jpg' invece di url ('logo.jpg'), mettendo immagine su vari posti all'interno della cartella WebContent e utilizzare la navigazione diverso (" ./ logo .jpg ") ma non ha funzionato.
Funziona bene se si imposta il percorso assoluto (ad esempio "d: /fop/images/logo.jpg") ma ho bisogno di resoconti nella mia applicazione.
Durante la ricerca, ho trovato che questo è correlato a fopFactory.setURIResolver() e/o userAgent.setBaseURL(). Ho provato qualcosa con quello, ma non ci sono riuscito.
Sono nuovo sia per JSF che per FOP e questa situazione di immagine mi ha infastidito un bel po '. Qualcuno può aiutarmi con questo, o almeno indirizzarmi ad un tutorial su "come configurare la FOP per l'uso relativo del percorso"?
EDIT: Non voglio eventuali percorsi assoluti e applicazione dovrebbe funzionare indipendentemente dalla sua posizione sul computer (per essere pubblicabile). La mia ricerca mi dice che ha qualcosa a che fare con la configurazione di FOP, ma non so come farlo :)
Grazie in anticipo.
P.S. Questo è il metodo che si chiama per visualizzare 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();
}
Grazie per la tua risposta. Ma non è quello che sto cercando. Quando crei xml, la stringa "/ path/to/app /" deve essere simile a "C: \ Eclipse \ workspace \ myProject \ .. etc" (se sto ottenendo il risultato giusto). Sto rendendo questa applicazione per essere pubblicabile e tutti i dati xml e le immagini di accesso devono essere referenziati nell'ambito di applicazione (scusa, non l'ho scritto esplicitamente nella mia domanda, lo modificherò ora). – Nikola