使用fop在XSL-FO中设置字体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用fop在XSL-FO中设置字体相关的知识,希望对你有一定的参考价值。

我在.fonts/Dinarra/文件夹中有文件Dinarra LT Std-Roman.otfDinarra LT Std-Italic.otf

fop.xconf中的字体配置如下:

<renderer mime="application/pdf">
  ...
  <fonts>
    ...
    <font kerning="yes" embed-url="'~/.fonts/Dinarra/DinarraLTStd-Roman.otf'" embedding-mode="subset">
      <font-triplet name="'Dinarra LT Std'" style="normal" weight="normal"/>
    </font>

    <font kerning="yes" embed-url="'~/.fonts/Dinarra/DinarraLTStd-Roman.otf'" embedding-mode="subset">
      <font-triplet name="'Dinarra LT Std'" style="normal" weight="bold"/>
    </font>

    <font kerning="yes" embed-url="'~/.fonts/Dinarra/DinarraLTStd-Italic.otf'" embedding-mode="subset">
      <font-triplet name="'Dinarra LT Std'" style="italic" weight="normal"/>
    </font>

    <font kerning="yes" embed-url="'~/.fonts/Dinarra/DinarraLTStd-Italic.otf'" embedding-mode="subset">
      <font-triplet name="'Dinarra LT Std'" style="italic" weight="bold"/>
    </font>

    <auto-detect/>
  </fonts>
</renderer>

我用fazxswpoi在fop中注册了字体。

现在我在文件fop -c ~/.fop/fop.xconf中有以下XSL-FO代码:

test.fob

使用<fo:static-content flow-name="first-page-before"> <fo:block font-family="'Dinarra LT Std'" font-size="28pt" font-style="normal" font-variant="small-caps"> <fo:block>S.E. Reverendo</fo:block> <fo:block>Gabriele Asperso</fo:block> </fo:block> </fo:static-content> 编译,输出如下:

fop -c ~/.fop/fop.xconf -r test.fob test.pdf

问题是块用斜体字体呈现,而不是正常字体,而不是小字体。

如果我从字体文件夹中删除文件rev@asp-erso ~/repos/f5qg16 $ fop -c ~/.fop/fop.xconf -r test.fob test.pdf [warning] /usr/bin/fop: No java runtime was found [warning] /usr/bin/fop: No java runtime was found [warning] /usr/bin/fop: No JAVA_CMD set for run_java, falling back to JAVA_CMD = java [INFO] FopConfParser - Default page-height set to: 11.00in [INFO] FopConfParser - Default page-width set to: 8.50in [WARN] FOUserAgent - Border and padding for fo:region-before "first-page-before" should be '0' (See 6.4.14 in XSL 1.1); non-standard values are allowed if relaxed validation is enabled. (See position 23:68) [WARN] FOUserAgent - Border and padding for fo:region-after "first-page-after" should be '0' (See 6.4.14 in XSL 1.1); non-standard values are allowed if relaxed validation is enabled. (See position 25:62) [INFO] FOUserAgent - Rendered page #1. [INFO] FOUserAgent - Rendered page #2. ,那么块将按预期呈现(但不是小型大写),但这样我就不能再使用斜体了。

我的问题是:

  1. 如何在XSL-FO声明中正确设置字体,以便我可以使用普通样式而不删除斜体文件?
  2. 如何设置字体以便我可以获得小型大写字母?

第2部分:一些实验

Dinarra LT Std-Italic.otf声明之前,我已仔细检查过测试文件中的“italic”字样;

我已经三次检查文件static-content中字体文件路径的exacteness;

我删除了文件~/.fop/fop.xconf并以这种方式修改了文件~/.fop/fop-fonts.cache

~/.fop/fop.xconf

我已经编译了重新注册字体的测试文档

<!-- ### deleted some 'font' element -->
<font kerning="yes"
      embed-url="'~/.fonts/Dinarra/DinarraLTStd-Roman.otf'"
      embedding-mode="subset">
  <font-triplet name="'Dinarra LT Std'"
                style="normal"
                weight="normal"/>
</font>

<font kerning="yes"
      embed-url="'~/.fonts/Dinarra/DinarraLTStd-Italic.otf'"
      embedding-mode="subset">
  <font-triplet name="'Dinarra LT Std'"
                style="italic"
                weight="normal"/>
</font>

<!-- ### commented-out auto-detect-->
<!-- <auto-detect/> -->

输出是:

fop -c ~/.fop/fop.xconf -r test.fob test.pdf

所以(第8行)fop找不到字体(!)。

然后我新删除了文件[warning] /usr/bin/fop: No java runtime was found [warning] /usr/bin/fop: No java runtime was found [warning] /usr/bin/fop: No JAVA_CMD set for run_java, falling back to JAVA_CMD = java [INFO] FopConfParser - Default page-height set to: 11.00in [INFO] FopConfParser - Default page-width set to: 8.50in [WARN] FOUserAgent - Border and padding for fo:region-before "first-page-before" should be '0' (See 6.4.14 in XSL 1.1); non-standard values are allowed if relaxed validation is enabled. (See position 23:68) [WARN] FOUserAgent - Border and padding for fo:region-after "first-page-after" should be '0' (See 6.4.14 in XSL 1.1); non-standard values are allowed if relaxed validation is enabled. (See position 25:62) [WARN] FOUserAgent - Font "Dinarra LT Std,normal,400" not found. Substituting with "any,normal,400". [INFO] FOUserAgent - Rendered page #1. [INFO] FOUserAgent - Rendered page #2. 并重新启用了~/.fop/fop-fonts.cache指令,最后重新编译了测试文件。输出为23,175行,其中没有一个包含'Dinarra'一词,也没有'otf'这个词。

auto-detect元素的内容仍然用斜体组成。


我不知道该怎么想。

答案

问题是块用斜体字体呈现,而不是正常的

这可能是字体注册中复制粘贴错误或拼写错误的简单情况。

检查输出中的警告或错误,通知您字体替换;如果没有,请仔细检查是否将斜体字体文件与斜体样式相关联,并将普通字体文件与正常样式相关联。

不是小型的

这个问题既简单又严重:不幸的是FOP fo:static-content

以上是关于使用fop在XSL-FO中设置字体的主要内容,如果未能解决你的问题,请参考以下文章

pdfbox / XSL + FOP 转换 PDF文档

如何使用 xsl-fo 和 apache fop 0.95 显示固定的图像高度和宽度

如何在 Apache FOP 中设置默认语言

如何在使用 FOP 的 XSL-FO 中保留带有标题的表格但允许在表格主体内分页符

如何使用 XSL-FO(和 Apache FOP)计算从应用模板返回的元素

FOP XSL-FO 锚定在外部目的地