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"));