FOP: wie Sie angeben-image src relativen Pfad?
Dies ist meine erste Frage hier, ich hoffe ich mache es richtig. Sorry für mein schlechtes Englisch, im Voraus 🙂
Ich bin mit JSF 2.0 (Eclipse-IDE), und ich versuche, zu erzeugen von PDF-Dateien mit Apache FOP 1.0.
War ich in der Lage, einfache PDF-Dateien mit dem Anweisungen auf Apache Fop Website , aber ich kann nicht legen Sie ein beliebiges Bild aus meinem Programm-Ordner. Meine Ordner Struktur ist so:
In meiner Anwendung WebContent habe ich (unter anderem)
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 clik 'showPDF" - button in meinem servlet, bekomme ich die PDF-Datei, ohne Bild, (alles was es sonst noch gibt), und diese Meldungen in der Konsole:
SCHWERER: Die Quelle, die zurückgegeben wurde
von URI Auflösung nicht enthalten, eine
InputStream für URI: logo.jpg Nov 18,
2010 5:16:49 PM
org.apache.fop.Veranstaltungen.LoggingEventListener
processEvent SCHWERER: Bild nicht gefunden.
URI: logo.jpg. (Keine Kontext-info
verfügbar)
Ich versuchte, verwenden 'logo.jpg" anstelle von url('logo.jpg'), putting Bild an verschiedenen stellen im WebContent-Ordner und mit verschiedenen Navigations - ("./logo.jpg") aber es hat nicht funktioniert.
Funktioniert es einwandfrei, wenn ich den absoluten Pfad (z.B. "d:/fop/images/logo.jpg") aber ich brauche Findmittel whitin meine Anwendung.
Während der Suche habe ich gefunden, dass dieses mit fopFactory.setURIResolver() und/oder userAgent.setBaseURL(). Versucht etwas, aber nicht erfolgreich.
Ich bin neu sowohl JSF und FOP, und dieses Bild die situation wurde stört mich schon eine ganze Weile. Kann mir jemand helfen mit diesem, oder zumindest mir einige Tutorials auf "konfigurieren FOP für relativen Pfad verwenden"?
EDIT: ich will keine absoluten Pfade und die app sollte unabhängig von seiner Lage auf dem computer (wird publiziert). Meine Suche sagt mir, es hat etwas zu tun mit der Konfiguration von FOP, aber ich weiß nicht, wie es zu tun 🙂
Vielen Dank im Voraus.
P. S. Dies ist die Methode, die aufgerufen wird, für die Anzeige von 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();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
fand ich die Lösung zu meinem problem. Ich dachte, das habe ich versucht, aber es scheint, ich machte einige kleine Fehler, dann zurück. Eh, mit folgendem code
können Sie den Zugriff auf Ihre Bilder (und andere Ressourcen) von Ihrem xslt-Datei mit relativem Pfad ausgehend von Ihrer Anwendung WebContent-Ordner. In meinem Fall, auf die ich zugreifen kann logo.jpg wie diese
Nahm mir Zeit, um herauszufinden, diese, ich verstehe es nicht, warum keine Beispiele mit solch grundlegende Sache im Netz (oder ich finde Sie nicht 🙂
Hinweis: In FOP 2.0 gibt es keine
setBaseURL()
Methode. Stattdessen übergeben Sie die Basis-URL als ein parameter anFopFactory.newInstance()
. Viele von den anderen setter verschoben wurden FopFactoryBuilder.Wenn Sie Zugriff auf die web-url für die Bilder, die Sie verwenden können, sowie bei der Erstellung von berichten, ie http://localhost/images/logo.jpg .
Aber während ich noch hatte Bilder lokal auf dem web-server, habe ich den Pfad der Anwendung in der XML-Datei und verwendet es wie folgt:
Wo die XML-Struktur könnte so etwas wie dieses:
Ich hatte das gleiche problem und habe versucht, diese Lösung:
Dann, auf XSL-verwendet habe ich:
Testen, wenn dies funktioniert, sollten Sie in der Lage sein, um das Bild auf dem Protokoll://link:port/img/Bild.png