Это мой первый вопрос, надеюсь, я все делаю правильно. Извините за мой плохой английский заранее:)
Я использую JSF 2.0 (Eclipse IDE) и пытаюсь сгенерировать некоторые PDF-файлы, используя Apache FOP 1.0.
Мне удалось создать простые PDF-файлы, используя инструкции на сайте Apache Fop , но я не могу вставить ни одно изображение из папки своего приложения. Моя структура папок выглядит так:
В моем приложении WebContent у меня есть (среди прочего)
pdf_transform / xslt / transformFile.xsl и
pdf_transform / XSLT / logo.jpg
В transformFile.xsl у меня есть
<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>
но когда я нажимаю кнопку «showPDF» в моем сервлете, я получаю файл PDF без изображения (все остальное есть), и это сообщение в консоли:
SEVERE: источник, который был возвращен
из резолюции URI не содержит
InputStream для URI: logo.jpg 18 ноября,
2010 17:16:49
org.apache.fop.events.LoggingEventListener
processEvent SEVERE: изображение не найдено.
URI: logo.jpg. (Нет контекстной информации
имеется)
Я пытался использовать 'logo.jpg' вместо URL ('logo.jpg'), помещая изображение в разные места внутри папки WebContent и используя другую навигацию ("./ logo.jpg"), но это не сработало.
Работает нормально, если я установил абсолютный путь (например, "d: /fop/images/logo.jpg"), но мне нужны ресурсы в моем приложении.
При поиске я обнаружил, что это связано с fopFactory.setURIResolver () и / или userAgent.setBaseURL (). Пробовал что-то с этим, но не удалось.
Я новичок как в JSF, так и в FOP, и эта ситуация с изображением беспокоила меня довольно давно. Может ли кто-нибудь помочь мне с этим, или, по крайней мере, направить меня к какому-нибудь учебнику "Как настроить FOP для использования относительного пути"?
РЕДАКТИРОВАТЬ: Я не хочу никаких абсолютных путей и приложение должно работать независимо от его местоположения на компьютере (для публикации). Мой поиск говорит мне, что это как-то связано с настройкой FOP, но я не знаю, как это сделать:)
Заранее спасибо.
P.S. Это метод, который вызывается для отображения 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();
}