Это мой первый вопрос здесь, я надеюсь, что я делаю это правильно. Извините за мой плохой английский заранее :)
Я использую 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 без изображения (все остальное есть), и это сообщение в консоли:
СЕРЬЕЗНЫЙ: источник, который был возвращен из разрешения URI, не содержал InputStream для URI: logo.jpg 18 ноября 2010 г. 17:16:49 org.apache.fop.events.LoggingEventListener processEvent СЕРЬЕЗНЫЙ: изображение не найдено. URI: логотип.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();
}