To jest moje pierwsze pytanie tutaj, mam nadzieję, że robię to dobrze. Przepraszam za mój zły język angielski z góry :)FOP: jak określić względną ścieżkę obrazu src?
Używam JSF 2.0 (Eclipse IDE) i próbuję wygenerować kilka plików PDF przy użyciu Apache FOP 1.0.
byłem w stanie dokonać prostych plików PDF za pomocą instrukcji na Apache Fop site, ale nie mogę wstawić dowolny obraz z mojego folderu aplikacji. Moja struktura folderów jest tak: w mojej aplikacji WebContent mam (wśród innego) pdf_transform/XSLT/transformFile.xsl i pdf_transform/XSLT/logo.jpg
W transformFile.xsl mam
<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>
ale kiedy clik przycisk „showPDF” w moim serwletu, i uzyskać plik PDF bez obrazu (wszystko jest tam), a to komunikaty w konsoli:
ciężkie: źródła, które zostało zwrócone fr om rozdzielczości URI nie zawierają InputStream dla URI: logo.jpg 18 Listopad, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent ciężkie: Image not found. URI: logo.jpg. (Brak informacji kontekst dostępny)
Próbowałem użyć „logo.jpg” zamiast url („logo.jpg”), umieszczenie obrazu w różnych miejscach wewnątrz folderu WebContent i przy użyciu różnych nawigacji (”./ logo .jpg "), ale nie działało.
Działa dobrze, jeśli ustawiam ścieżkę bezwzględną (na przykład "d: /fop/images/logo.jpg"), ale muszę zmaterializować odrobinę mojej aplikacji.
Podczas wyszukiwania znalazłem, że jest to związane z fopFactory.setURIResolver() i/lub userAgent.setBaseURL(). Próbowałem czegoś z tym, ale się nie udało.
Jestem nowym zarówno JSF i FOP, a sytuacja ta grafika została przeszkadza mi sporo czasu. Czy ktoś może mi w tym pomóc, a przynajmniej skieruje mnie do samouczka na temat "jak skonfigurować FOP do względnego wykorzystania ścieżki"?
EDYCJA: Nie chcę żadnych bezwzględnych ścieżek i aplikacja powinna działać niezależnie od jej lokalizacji na komputerze (do publikacji). Moje poszukiwania mówi mi, że to ma coś wspólnego z konfiguracją FOP, ale nie wiem jak to zrobić :)
Z góry dzięki.
P.S. Jest to metoda, która nazywa się wyświetlić 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();
}
Dziękuję za odpowiedź. Ale tego nie szukam. Kiedy tworzysz xml, ciąg "/ path/to/app /" musi wyglądać jak "C: \ Eclipse \ workspace \ myProject \ .. etc" (jeśli mam prawo). Uczyniam, że ta aplikacja będzie dostępna do publikacji, a wszystkie dane i obrazy xml uzyskujące dostęp będą musiały odnosić się do zakresu zastosowania whitin (przepraszam, nie napisałem tego wyraźnie w moim pytaniu, będę teraz edytować). – Nikola