Apache FOP: как установить базовый URL для доступа к внешнему ресурсу, используя относительный путь

В моем файле.xsl я использую внешнюю графику, как это
<fo:external-graphic width="90pt" height="29pt" src="url(xsl/logo.jpg)"/>

Но изображение не загружается в сгенерированный PDF, и я получаю эту ошибку в консоли.
[ERROR] Error while creating area : Error with image URL: xsl\logo.jpg (The system cannotfind the path specified) and no base URL is specified

Как мне решить эту проблему? Я думаю, что установка базового URL будет делать. Но как установить базовый URL? Пожалуйста помоги.

4 ответа

Решение

Я получил решение по этой ссылке
http://groups.yahoo.com/group/XSL-FO/message/6116

установить базовый каталог с помощью кода Java

ServletContext servletContext = getServletConfig().getServletContext();

String appPath = servletContext.getRealPath(""); //root of web app
org.apache.fop.configuration.Configuration.put("baseDir",appPath);

Это сработало для меня.
Пожалуйста, напишите, если вы знаете лучшее решение.

Я использую Apache FOP 1.1 Ver.

    fopFactory = FopFactory.newInstance();
    // for image base URL : images from Resource path of project
    String serverPath = request.getSession().getServletContext().getRealPath("/");
    fopFactory.setBaseURL(serverPath);
    // for fonts base URL :  .ttf from Resource path of project
    fopFactory.getFontManager().setFontBaseURL(serverPath);

Я добавил все изображения и файлы шрифтов необходимых шрифтов в директорию ресурсов моего проекта. Это работает нормально для меня. Спасибо

У меня была такая же проблема, и это работает только для меня в версии 0.95 fop. SetBaseUrl игнорируется в версии 1.0

Решение для версий 1.0, 1.1: В fop 1.0 и 1.1 метод setBaseURL() не работает корректно с локальными файлами, поэтому вы можете использовать метод setURIResolveri и написать свою реализацию интерфейса URIResolver.

1.Добавить в использует импорт javax.xml.transform.URIResolver;

2.Добавить в основной класс

 private static class LocalResolver implements URIResolver {
         private String BaseFolder; 
            @Override
            public Source resolve(String href, String base) throws TransformerException {
             File f = new File(BaseFolder + "\\" + href);
             if (f.exists())
             return new StreamSource(f);
                     else
                      throw new TransformerException("File " + f.getAbsolutePath() +" not found!");         
            }

         public LocalResolver(String BaseFolder) {
           this.BaseFolder = BaseFolder;   
         }

     }

Fop fop = fopFactory.newFop (MimeConstants.MIME_PDF, out);

3. Добавьте перед вызовом transformer.transform(src, res) это:

fop.getUserAgent().setURIResolver(new LocalResolver("C:\\Users\\photon\\Downloads\\fop-1.1-bin\\fop-1.1"));
Другие вопросы по тегам