FOP: как указать относительный путь к src изображения?

Это мой первый вопрос, надеюсь, я все правильно делаю. Заранее извиняюсь за плохой английский :)

Я использую JSF 2.0 (Eclipse IDE) и пытаюсь сгенерировать некоторые PDF-файлы с помощью Apache FOP 1.0.

Мне удалось создать простые PDF-файлы, используя инструкции на Сайт Apache Fop , но я могу t вставить любое изображение из папки моего приложения. Моя структура папок такая: В моем приложении WebContent у меня есть (среди прочего) pdf_transform / xslt / transformFile.xsl и pdf_transform / xslt / logo.jpg

В transformFile.xsl у меня есть


, но когда я нажимаю кнопку '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, но я не знаю, как это сделать :)

Заранее спасибо.

PS Это метод, который вызывается для отображения 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();
}

9
задан Nikola 18 November 2010 в 21:41
поделиться