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

Apache FOP embedded,如何使用配置文件

柏高洁
2023-03-14

我正在使用Apache FOP将SVG渲染为PDF。这个SVG有一种特殊的字体,我也想在生成的PDF中使用。

我使用的配置文件如下所示:

<?xml version="1.0"?>
<fop version="1.0">
    <base>.</base>
    <source-resolution>72</source-resolution>
    <target-resolution>72</target-resolution>
    <default-page-settings height="11.00in" width="8.50in" />
    <renderers>
        <renderer mime="application/pdf">
            <filterList>
                <value>flate</value>
            </filterList>
            <fonts>
                <font
                    metrics-url="path/to/metrics.xml"
                    kerning="yes"
                    embed-url="path/to/font.ttf">
                    <font-triplet name="font name" style="normal" weight="normal" />
                </font>
            </fonts>
        </renderer>
    </renderers>
</fop>

我从示例配置中复制并粘贴了它,并编辑了所有不需要的渲染器。现在我尝试使用这样的配置:

public void convertSVG2PDF(String svg, OutputStream out) throws IOException, TranscoderException {

        // Create transcoder
        AbstractFOPTranscoder transcoder = new PDFTranscoder();
        DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
        Configuration cfg;

        try {
            File configFile = new File("path/to/config.xml");

            cfg = cfgBuilder.buildFromFile(configFile);
            transcoder.configure(cfg);
            System.err.println(cfg.getValue());
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }

        // Setup input
        Reader in = new java.io.StringReader(svg);

        try {
            TranscoderInput input = new TranscoderInput(in);
            // Setup output
            try {
                TranscoderOutput output = new TranscoderOutput(out);
                // Do the transformation
                transcoder.transcode(input, output);
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }

这将呈现一个完美的PDF,但是没有使用字体。当我尝试cfg.getValue()时,我也会收到这条消息

文件/path/to/conf.xml:1:20中没有与配置元素“fop”关联的值

我还尝试将配置重命名为。xconf,但这并没有改变什么。

共有2个答案

陆寒
2023-03-14

试试这个...它对我有用:

FopFactory fopFactory;
fopFactory = FopFactory.newInstance();



File configFile = new File("path/to/config.xml");
fopFactory.setUserConfig(configFile);
乌靖
2023-03-14

这适用于版本fop 2.3

File xconf = new File(this.fopConfigFile.toURI()); 
FopConfParser parser = null;
try {
  //parsing configuration 
  parser = new FopConfParser(xconf);
} catch (SAXException e) {
    throw new UncheckedIOException(new IOException(e));
} catch (IOException e) {
    throw new UncheckedIOException(e);
}  
//building the factory with the user options
FopFactoryBuilder builder = parser.getFopFactoryBuilder(); 
this.fopFactory = builder.build();
Fop fop = this.fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

文档 : https://xmlgraphics.apache.org/fop/2.3/upgrading.html

 类似资料:
  • 问题内容: 我有一个使用maven作为构建工具的应用程序。 我正在使用Maven配置文件从不同的配置文件设置不同的属性。 我想做的是将maven中的所有活动配置文件也移植到spring活动配置文件中,以便我可以在bean签名()中引用它们。但我不确定该怎么做。 例如:考虑以下Maven设置 假设我在未指定任何其他配置文件的情况下运行maven,而我希望spring具有和 配置为活动配置文件。 问题

  • 我有、和 我正在使用maven命令它不起作用,并且我无法使用选择开发配置文件。如何选择? 文档中说可以工作,我尝试了但没有工作。在我的项目中,我使用它运行,但是如果我使用选择dev配置文件,控制台会打印这么多日志并警告我从来没有看到使用过,并告诉我 那么如何解决两个问题呢?谢谢~

  • 我正在尝试将我的应用程序配置为具有两个构建配置文件:开发和生产。为此,我在src/main/resources文件夹下创建了两个子目录:src/main/resources/development和src/main/resources/production。每个子目录都有自己的。属性文件。 我使用命令mvn install-P${profile_here}构建应用程序 Maven将与所选配置文件相

  • 问题内容: 我正在尝试根据某个Maven配置文件是否处于活动状态来使用数据库信息配置Spring配置文件。我已经看到了一些答案,但是很难将它们放在一起。 我有一个这样的Maven个人资料: 还有一个settings.xml文件,如下所示: 并在servlet-context.xml中: 我的问题基本上是,如何将Maven属性放入servlet- context.xml文件中?我需要一个.prope

  • 问题内容: 我想使用带有以下条目的application.properties文件设置配置文件: 如何在我的context.xml文件中设置spring.profiles.active?init-param仅在web.xml上下文中有效。 问题答案: 有几种更改活动配置文件的方法,这些方法都不直接取自属性文件。 您可以像在问题中一样使用。 您可以在应用程序启动时提供系统参数 你可以得到从你和编程方

  • 在Windows上,是否可以将Atom配置为使用系统默认代理,而不是在.apmrc文件中手动指定代理设置? 我最近开始使用atom-editor for Windows(Windows7 Pro),到目前为止我很喜欢它。我已经搜索了一段时间,试图让编辑能够连接到外部世界,但没有遇到任何成功。 我们的网络(我不是网络专家)配置为使用代理服务器(内部)访问Internet。在我的系统中,这是通过“自动