Apache FOP:如何设置使用相对路径访问外部资源的基本 URL

发布于 2024-10-26 19:40:27 字数 306 浏览 0 评论 0原文

在我的 .xsl 文件中,我使用这样的外部图形

但图像未加载到生成的 PDF 中,并且我在控制台中收到此错误。
[ERROR] 创建区域时出错:图像 URL 错误:xsl\logo.jpg(系统找不到指定的路径)且未指定基本 URL

如何解决此问题?我想设置基本 URL 就可以了。但如何设置基址呢?请帮忙。

In my .xsl file I am using external graphics like this
<fo:external-graphic width="90pt" height="29pt" src="url(xsl/logo.jpg)"/>

But image is not getting loaded in the generated PDF and I get this error in console.
[ERROR] Error while creating area : Error with image URL: xsl\logo.jpg (The system cannotfind the path specified) and no base URL is specified

How do I solve this issue? I guess setting the base URL will do. But how to set the base URL? Please help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

戈亓 2024-11-02 19:40:27

我从这个链接得到了一个解决方案
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);

这对我有用。
如果您知道更好的解决方案,请留言。

I got a solution from this link
http://groups.yahoo.com/group/XSL-FO/message/6116

set base dir using Java code

ServletContext servletContext = getServletConfig().getServletContext();

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

This worked for me.
Please post if you know any better solution.

面犯桃花 2024-11-02 19:40:27

我正在使用 Apache FOP 1.1 版本。

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

我在项目的资源管理器中添加了所有图像和所需的字体文件。
它对我来说工作得很好。
谢谢

I am using 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);

I added all images and required font font files in resource director of my project.
It is working fine for me.
Thank you

善良天后 2024-11-02 19:40:27

我遇到了同样的问题,这只适用于我的 fop 0.95 版本。
SetBaseUrl 在 1.0 版本中被忽略

I had the same problem and this only works for me in the version 0.95 of fop.
SetBaseUrl is ignored in version 1.0

不忘初心 2024-11-02 19:40:27

1.0、1.1版本的解决方案:
在 fop 1.0 和 1.1 中,方法 setBaseURL() 无法正确处理本地文件,因此您可以使用方法 setURIResolveri 并编写接口 URIResolver 的实现。

1.添加用途
导入 javax.xml.transform.URIResolver;

2.在mainClass中添加

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

Solution for versions 1.0, 1.1 :
In fop 1.0 and 1.1 method setBaseURL() does not work correctly with local files, so you can use method setURIResolveri and write your implementation of interface URIResolver.

1.Add in uses
import javax.xml.transform.URIResolver;

2.Add in mainClass

 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.Add before call transformer.transform(src, res) this:

fop.getUserAgent().setURIResolver(new LocalResolver("C:\\Users\\photon\\Downloads\\fop-1.1-bin\\fop-1.1"));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文