Dies ist meine erste Frage hier, ich hoffe, ich mache es richtig. Sorry für mein schlechtes Englisch im Voraus :)FOP: Wie man relativen Pfad des Bildes src spezifiziert?
Ich benutze JSF 2.0 (Eclipse IDE) und ich versuche, einige PDF-Dateien mit Apache FOP 1.0 zu generieren.
Ich konnte einfache PDF-Dateien mit Anweisungen auf Apache Fop site erstellen, aber ich kann kein Bild aus meinem Anwendungsordner einfügen. Meine Ordnerstruktur ist wie folgt aus: In meiner Anwendung WebContent i (unter anderem) haben pdf_transform/xslt/transformFile.xsl und pdf_transform/xslt/logo.jpg
In transformFile.xsl ich habe
<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>
aber wenn ich 'showPDF' Button in meinem Servlet clik, i PDF-Datei ohne Bild zu erhalten (alles andere ist es), und diese Nachrichten in der Konsole:
SCHWEREN: Die Quelle, die fr zurückgegeben wurde om URI-Auflösung enthielt keine InputStream für URI: logo.jpg 18. November, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Bild nicht gefunden. URI: logo.jpg. (Kein Kontext info verfügbar)
Ich habe versucht, 'logo.jpg' anstelle von url ('logo.jpg') zu verwenden, an verschiedenen Orten innerhalb WebContent Ordner setzen Bild und mit verschiedenen Navigation (“./ logo .jpg ") aber es hat nicht funktioniert.
Es funktioniert gut, wenn ich absoluten Pfad (zum Beispiel "d: /fop/images/logo.jpg") einstellen, aber ich muss in meiner Anwendung wieder auftauchen.
Während der Suche fand ich, dass dies zu fopFactory.setURResolver() und/oder userAgent.setBaseURL() verwandt ist. Versuchte etwas damit, aber es gelang nicht.
Ich bin neu in JSF und FOP, und diese Bildsituation hat mich schon eine ganze Weile gestört. Kann mir jemand dabei helfen oder mich zumindest zu einem Tutorial über "Wie konfiguriere ich FOP für die relative Pfadnutzung?"
EDIT: Ich möchte keine absoluten Pfade und App sollte unabhängig von ihrem Standort auf dem Computer arbeiten (zu veröffentlichen). Meine Suche sagt mir, es hat etwas mit der Konfiguration von FOP zu tun, aber ich weiß nicht, wie es geht :)
Vielen Dank im Voraus.
P.S. Dies ist die Methode PDF aufgerufen wird angezeigt:
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();
}
Vielen Dank für Ihre Antwort. Aber das ist nicht was ich suche. Wenn Sie xml erstellen, muss die Zeichenfolge "/ Pfad/zu/app /" etwa so aussehen wie "C: \ Eclipse \ workspace \ myProject \ .. etc" (wenn Sie es richtig machen). Ich mache diese Anwendung zu veröffentlichen und alle XML-Daten und Bilder im Zugriff müssen Referenz innerhalb Anwendungsumfang sein (sorry, habe das nicht explizit in meiner Frage geschrieben, ich werde es jetzt bearbeiten). – Nikola