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

将Fop1.1替换为Fop1.0后,Apache FOP缺少标志符号

史英飙
2023-03-14

我使用嵌入在Java应用程序中的Apache FOP 1.1成功地将XML转换为PDF。不幸的是,我被指示降级到FOP 1.0,以遵守公司许可证。所以,我用1.1 jar替换了1.0 jar,并交叉检查了依赖程序的兼容性。一切都正常,程序运行良好。然而,FOP 1.0生成的PDF仅包含每个错误字符的“#”:

Glyph "M" (0x4d, M) not available in font "Helvetica".

(这里,“M”只是作为一个例子。但是它显示了文件中每个字符的错误。)我在Apache网站上查找了这个错误,它说:

If no glyph can be found for a given character, FOP will issue a warning and use the glpyh for "#" (if available) instead.

我觉得这很奇怪,因为这个代码在FOP 1.1中运行良好,我使用的是基本的字母数字字符。(也就是说,即使是“你好世界”也不能正确打印)。我的转换代码基于Apache网站上的示例,非常简单

//Constructs a fop with desired output format and user settings
Fop fop = fopFactory.newFop("application/pdf", agent, out);

//Setup JAXP using identity transformer direct from XSLT:FO output template
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(new StringReader(xslfoReceiptLayout))); // identity transformer

//Setup input stream from XML string
Source src = new StreamSource(new StringReader(receiptXml));

//Resulting SAX events msut be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());

//Start XSLT transformation and FOP processing
transformer.transform(src, res);

logger.debug("Finished XML to PDF conversion");

其中xslfoReceiptLayout是包含我的xslfo数据的字符串。我已经尝试将此数据简化为W3站点的示例,效果相同:

<?xml version="1.0" encoding="UTF-8"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
  <fo:simple-page-master master-name="A4">
    <fo:region-body />
  </fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="A4">
  <fo:flow flow-name="xsl-region-body">
    <fo:block>Hello W3Schools</fo:block>
  </fo:flow>
</fo:page-sequence>

</fo:root>

我尝试过的事情:

  • 使用配置文件手动配置字体以自动检测系统字体
  • 将字体基本目录设置为系统字体目录
  • 为xsl:fo中的字体族值设置不同的字体

我不清楚我错过了什么。我一直在搜索Apache网站和谷歌,寻找Fop1.0和Fop1.1之间与此相关的变化,但没有结果。有人有什么想法吗?

共有1个答案

丁鹏鹍
2023-03-14

我在公司的asset manager网站上找到了FOP1.0 jar的预编译版本,它似乎已经解决了这个问题。不确定我的1.0版本是从Apache站点获取的源代码哪里出错的。我最好的猜测是,预编译版本包含Apache源代码所没有的自包含字体。

 类似资料:
  • 我有一个数据集,包含一系列国家和年份的几个指标的值(3072,1134行和列),但有些NaN。 下面是数据集的示例: 我想根据提交的

  • 我正在自己学习Java,并使用在线练习进行练习。到目前为止,我只学到了直到方法,所以在这个练习中使用数组超出了我的范围,即使一些在线解决方案使用数组来做我想做的事情。 练习是这样的:让用户输入一个带有元音的字符串。只要有元音字母,就将该元音显示为大写字母。 例如:如果用户输入“苹果”,正确的输出是苹果 到目前为止,我有这段代码: 当我运行我的代码时,例如,输入字符串“苹果”,我得到“苹果”作为我的

  • 我在jsoup中遇到了一个问题,我希望获得一行数据,稍后我将把该行插入另一个html文档中。但当我检查时,时间发现没有和标签。我该怎么解决呢

  • 问题内容: 使用Swift,我试图获取应用程序文本视图中输入的数字列表,并通过为成绩计算器提取每个数字来创建此列表的总和。而且,用户输入的值量每次都会更改。一个例子如下所示: 字符串:98,99,97,96 …试图获取:98 + 99 + 97 + 96 … 请帮忙!谢谢 问题答案: 使用打破了逗号分隔的字符串。 使用前,每一个元素后删除空格 使用每个元素转换为整数。 使用(以前称为)删除所有无法

  • 问题内容: 我正在使用SQL Server 2008,并且我有一个包含大约50个轧机行的表。 该表包含类型为的主要标识列。 我想将该专栏升级为。 我需要知道如何以一种快速的方式做到这一点,这不会使我的数据库服务器不可用,也不会删除或破坏我的任何数据 我该怎么做呢?这样做的后果是什么? 问题答案: 好吧,这真的不是一种快速简便的方法。 我的方法是这样的: 创建具有相同结构的新表-除了将列替换为 -—

  • 问题内容: 所以我似乎无法弄清楚…我有一句话要说,我希望它成为。我已经尝试了以下所有方法,但似乎都没有效果; 我真的不明白为什么最后一个有效,因为这样可以正常工作: 我在这里想念什么吗? 编辑 我知道\是转义字符。我要在这里执行的操作是将所有内容都 转换为其他内容, 并且替换似乎没有按照我的预期进行。 我希望字符串a看起来像字符串b。但是替换并不能像我想的那样替换斜线。 问题答案: 无需为此使用r