当前位置: 首页 > 知识库问答 >
问题:

为FOP从JAR加载字体

谷梁英资
2023-03-14

我的应用程序的JAR中的fonts目录中有一个TTF字体。

 myapp.jar /
     fop /
        config.xml
        font.ttf

我这样创建我的FOP:

    FopFactory fopFactory = FopFactory.newInstance();
    fopFactory.setStrictValidation(false);
    fopFactory.setUserConfig(getClasspathFile("/fop/config.xml"));
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
   ...

如何在我正在渲染的 PDF 文件中将 config.xml 配置为嵌入字体.ttf

共有1个答案

谭锐藻
2023-03-14

我的帖子似乎太晚了,但可能对其他人有用。[java 8,fop 2.1]

import lombok.SneakyThrows;
...
        @SneakyThrows
            private FopFactory getFopFactory(){
                InputStream fopConfigStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("/fop/config.xml");
                FopFactoryBuilder builder = new FopFactoryBuilder(new File(".").toURI(), new CustomPathResolver());
                FopFactory factory = builder.setConfiguration(new DefaultConfigurationBuilder().build(fopConfigStream)).build();
                fopConfigStream.close();
                return factory;
            }
    ...
        private static final class CustomPathResolver implements ResourceResolver {
            @Override
            public OutputStream getOutputStream(URI uri) throws IOException {
                return Thread.currentThread().getContextClassLoader().getResource(uri.toString()).openConnection()
                        .getOutputStream();
            }

            @Override
            public Resource getResource(URI uri) throws IOException {
                InputStream inputStream = ClassLoader.getSystemResourceAsStream("fop/" + FilenameUtils.getName(uri));
                return new Resource(inputStream);
            }
        }

配置文件:

<fop version="1.0">
    <renderers>
        <renderer mime="application/pdf">
            <fonts>
              <font kerning="yes" embed-url="font.ttf" embedding-mode="subset">
                <font-triplet name="Font name" style="normal" weight="normal"/>
              </font>
            </fonts>
        </renderer>
    </renderers>
</fop>
 类似资料:
  • 问题内容: 我可以使用ClassLoader实现从InputStream加载类吗? 我正在尝试将具有InputStream的JAR加载到新的ClassLoader中。 问题答案: 这不太可能,因为您会发现自己尝试这样做。您将无法根据需要随机访问和查找类,因此您必须将内容缓存在内存或文件系统中。 如果您在磁盘上缓存,则只需使用URLClassLoader即可。 如果缓存在内存中,则需要使用JarIn

  • 问题内容: 看了关于SO的其他帖子,他们没有解决此问题。 我正在尝试从jar文件加载图像。它持续为null。该图像位于以下位置: 要加载我正在执行的图像: url为null,bImg也为null。 我已经检查过了,不必担心区分大小写。 问题答案: 试试这个 :

  • 在使用Maven捆绑JAR文件中的资源时,我有一种感觉,我错过了一些关键的东西。我的目录结构是标准的Maven结构(即\src\main\java,\src\main\Resources)。 使用IDE时,我将资源文件引用为\main\resources\images\blah。。。它工作得很好,但当Maven捆绑JAR文件时,它会将路径放在相对于根的位置(“\ images\blah”),因此没

  • 我正在使用Scene Builder2.0和eclipse Luna。在fxml文件中,我有我的场景的代码和图像。如果我在eclipse上测试这一点,一切都是正常的,但是如果我将它导出到可运行的jar中,然后运行它,我就会得到没有图像的窗口...以下是部分代码: 文件结构: 我觉得问题出在路径上,但我不知道这条路是怎么走的。加载程序代码: 初始化函数:

  • 我正在使用从资源加载的自定义字体。此代码在Eclipse中完美运行,但在作为jar运行时会出现错误。 作为jar运行时,会出现以下错误(从命令提示符窗口): 第83行如上述注释所示

  • 问题内容: 一些用户抱怨小程序不再起作用,当他们查看Java控制台时,遇到一个java.lang.noClassDefFoundError并检查我的访问日志,我发现他们已经下载了包含该类的jar文件,然后发出get命令。要求特定的班级。 不同的用户中断不同的类。 一些用户很好。 任何想法可能导致此问题/解决此问题。 我已经检查以确保该文件位于其Java缓存中,清除了缓存等。似乎没有任何修复方法。