如何在 AFP 中使用 TrueType 字体与 Apache FOP?

How to use TrueType Fonts in AFP with Apache FOP?

我正在尝试在 AFP 中使用 TrueType 字体和 Apache FOP 2.2。

我相信我配置正确,但出现以下异常:

java.lang.ClassCastException: org.apache.fop.afp.modca.MapDataResource cannot be cast to org.apache.fop.afp.modca.MapCodedFont
    at org.apache.fop.afp.modca.ActiveEnvironmentGroup.getCurrentMapCodedFont(ActiveEnvironmentGroup.java:286)
    at org.apache.fop.afp.modca.ActiveEnvironmentGroup.createFont(ActiveEnvironmentGroup.java:201)
    at org.apache.fop.afp.modca.AbstractPageObject.createFont(AbstractPageObject.java:149)
    at org.apache.fop.afp.DataStream.createFont(DataStream.java:331)
    at org.apache.fop.afp.DataStream.addFontsToCurrentPage(DataStream.java:313)
    at org.apache.fop.render.afp.AFPDocumentHandler.endPage(AFPDocumentHandler.java:310)
    at org.apache.fop.render.intermediate.util.IFDocumentHandlerProxy.endPage(IFDocumentHandlerProxy.java:167)
    at org.apache.fop.render.intermediate.EventProducingFilter.endPage(EventProducingFilter.java:48)
    at org.apache.fop.render.intermediate.IFRenderer.renderPage(IFRenderer.java:603)
    at org.apache.fop.area.RenderPagesModel.renderPage(RenderPagesModel.java:193)
    at org.apache.fop.area.RenderPagesModel.checkPreparedPages(RenderPagesModel.java:174)
    at org.apache.fop.area.RenderPagesModel.addPage(RenderPagesModel.java:146)
    at org.apache.fop.layoutmgr.AbstractPageSequenceLayoutManager.finishPage(AbstractPageSequenceLayoutManager.java:316)
    at org.apache.fop.layoutmgr.PageSequenceLayoutManager.finishPage(PageSequenceLayoutManager.java:226)
    at org.apache.fop.layoutmgr.PageSequenceLayoutManager.activateLayout(PageSequenceLayoutManager.java:145)
    at org.apache.fop.area.AreaTreeHandler.endPageSequence(AreaTreeHandler.java:267)
    at org.apache.fop.fo.pagination.PageSequence.endOfNode(PageSequence.java:130)
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:360)
    at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:190)

下面是我的 conf.xml 配置的片段:

<renderer mime="application/x-afp">
    <fonts>
        <font name="Script MT Bold" kerning="yes" embed-url="/fonts/SCRIPTBL.TTF">
            <font-triplet name="Script MT Bold" style="normal" weight="normal"/>
        </font>
    </fonts>
</renderer>

我需要额外的配置吗?

此外,我必须在 AFP 中嵌入 TrueType 字体还是我可以简单地包含一个引用并依靠大型机打印机来解决它?

我也遇到了同样的异常。似乎在创建用于呈现当前页面的字体时,FOP 填充了一个 AbstractStructuredObject 列表。

在加载 True Type 字体时,FOP 会为其创建一个 MapDataResource 并将其填充到 AbstractStructuredObject 列表中。

但是,如果页面有一些其他字体,例如光栅字体,那么在加载此光栅字体之前,它会从列表中获取最新的 AbstractStructuredObject 并将其类型转换为 MapCodedFont。因为最近的对象是 MapDataResource 类型,所以我们得到 ClassCastException。

作为解决方法,我目前在我的 AFP 文档中仅使用 True Type 字体,并将默认字体三元组添加到其中一个字体配置中。

<font name="Script MT Bold" kerning="yes" embed-url="/fonts/SCRIPTBL.TTF">
    <font-triplet name="Script MT Bold" style="normal" weight="normal"/>
    <font-triplet name="any" style="normal" weight="normal"/>
</font>