如何使用FOP在XML-FO中指定2ch的缩进

时间:2017-09-16 00:22:30

标签: css apache-fop

我正在尝试在XML-FO文档中使用固定宽度字体创建两个字符的缩进。我正在使用FOP进行翻译。

不幸的是,当我指定类似public static void main(String[] args) { CloseableReentrantLock lock = new CloseableReentrantLock(); try (ResourceLock ignored = lock.lockAsResource()) { try (ResourceLock ignored2 = lock.lockAsResource()) { System.out.println(lock.getHoldCount()); // 2 } } System.out.println(lock.getHoldCount()); // 0 } 的长度时,FOP会产生以下错误消息:

"2ch"

XML-FO文档声明允许任何CSS已知长度单位,CSS指定[ERROR] PropertyMaker - Unknown length unit 'ch' ch字符的宽度。所以AFAIU应该可以工作,但仍然没有。

我也未能找到FOP理解的长度单位的具体列表(0也不起作用)。但是ix被理解了。但它代表(即使使用固定宽度字体等宽字体)宽度约为1.5个字符。

有没有办法在monospace中指定缩进两个字符?

FOP是否支持全面的长度单位列表?

有没有其他方法可以实现我通过具体数量的字符缩进的目标?我可以使用像em这样的黑客,但这可能不完全正确。

1 个答案:

答案 0 :(得分:1)

XSL recommendation中定义的度量单位为:

  • cm(厘米)
  • mm(毫米)
  • in(英寸)
  • pt(分)
  • pc(picas)
  • px(像素)
  • em(当前字体大小)

FOP支持所有,添加了mpt(millipoints),但正如您所注意到的,它们都没有引用等宽字体的字符宽度。< / p>

其他格式化程序可能支持其他度量单位,例如我看到AntennaHouse XSLFormatter支持ch

FOP

的可能解决方法

如果您只需要text-indent(即仅用于第一行),则可以使用不间断空格

<fo:block>&#x00A0;&#x00A0;Lorem ipsum dolor ...</fo:block>

如果您事先知道该块只会生成一行,您还可以使用保留的常规空间,以便更容易阅读FO文件:

<fo:block white-space-treatment="preserve" 
    white-space-collapse="false">  Lorem ipsum dolor ...</fo:block>

在最常见的情况下(如果您要定义start-indentend-indent,...),您可以使用字体信息计算确切的值:

  1. 创建字体指标

    java -classpath build/fop.jar:fop/lib/avalon-framework-api-4.3.1.jar:fop/lib/commons-logging-1.0.4.jar:fop/lib/commons-io-1.3.1.jar:fop/lib/xmlgraphics-commons-svn-trunk.jar org.apache.fop.fonts.apps.TTFReader -enc ansi /path/to/font.ttf metrics.xml

  2. 打开metrics.xml并查找与<char idx="29" wdt="600"/>类似的元素(wdt值可能不同,但对于所有char元素应该相同)

  3. wdt是以毫微分为单位的字符宽度:将其乘以font-size和字符数,然后得到所需的长度

  4. 例如: 600 x 12 x 2 = 14400mpt = 14.4pt =两个字符的长度,font-size为12pt