使用fop在XSL-FO中设置字体
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用fop在XSL-FO中设置字体相关的知识,希望对你有一定的参考价值。
我在.fonts/Dinarra/
文件夹中有文件Dinarra LT Std-Roman.otf
和Dinarra 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.
,那么块将按预期呈现(但不是小型大写),但这样我就不能再使用斜体了。
我的问题是:
- 如何在XSL-FO声明中正确设置字体,以便我可以使用普通样式而不删除斜体文件?
- 如何设置字体以便我可以获得小型大写字母?
第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中设置字体的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 xsl-fo 和 apache fop 0.95 显示固定的图像高度和宽度
如何在使用 FOP 的 XSL-FO 中保留带有标题的表格但允许在表格主体内分页符