【发布时间】:2014-03-14 08:19:32
【问题描述】:
我有一个项目要求我在一段文本中的一些带下划线的文本下放置一个 ID 字符串。
这是一个使用带有灰色边框的内联 SVG 对象来显示布局的示例:
我可以使用带有基线移位的内联元素来接近,然后使用 SVG 来呈现文本。然而,这有一个缺点(我认为),我必须手动输入 SVG 的宽度(以像素为单位),这对于如此简单的布局来说似乎非常复杂。
这里是 XSL-FO 标记:
<fo:block>
Normal text
<fo:inline baseline-shift="-100%">
<fo:instream-foreign-object text-align="center" display-align="center" border="solid silver 1px">
<svg xmlns="http://www.w3.org/2000/svg" height="25" width="120" viewport="0 0 120 25">
<text x="60" y="10" fill="black" text-anchor="middle" text-decoration="underline" font-size="12pt">underlined text with id</text>
<text x="60" y="25" fill="black" text-anchor="middle" font-size="12pt">123</text>
</svg>
</fo:instream-foreign-object>
</fo:inline>
normal text.
</fo:block>
所以我的问题是:我可以在不使用 instream-foreign-object 和 SVG 的情况下在 Apache FOP XSL-FO 中执行此布局吗?如果我不能,是否有某种方法不必将 SVG 中的宽度以像素为单位?或者有什么方法可以计算 SVG 渲染需要多少像素?
我还要注意 Apache FOP 不支持 inline-container。
https://xmlgraphics.apache.org/fop/compliance.html
提前致谢! - 丹
【问题讨论】:
-
您的问题中没有足够的信息来提供答案。示例:如果您将其放置在其中的文本变形为多行会发生什么?以下文本行会发生什么...特别是行距以及您所绘制的内容会影响它的事实?您还没有充分考虑过这一点,或者如果您考虑过,您肯定没有提供足够的信息让某人甚至推荐解决方案。
-
我对 Apache FOP 支持的内容没有经验,但如果我使用 RenderX,我会 (1) 将您请求的片段格式化为区域树格式(称为 XEPOUT)。由此,您可以确定片段的宽度和高度。然后 (2) 将 (a) 将该片段用作图像(在 RenderX XEP 中支持)或 (b) 您可以将该区域树转换为 SVG,并且您会知道您需要的像素宽度。我们这样做是为了将 SVG 渐变应用于文档中格式化的多行文本。
-
嗨,Kevin,要回答您的问题,带下划线的文本应该与任何其他带下划线的文本完全一样。如果需要,它应该包装。正如我在问题中所说,我的目标是使用 Apache FOP 进行此布局,而不使用 SVG,也无需手动估计 SVG 中文本的宽度。谢谢 - 丹
-
你能用 MathML 吗?
-
只是为了澄清,然后使用上面的示例,假设计算的换行符出现在单词“text”处......这看起来像什么?一行是“带下划线的文本”,下一行是“with id”,底部在哪里?由于您正在绘制的对象大于单行的高度,因此在所有情况下行距是什么样的?整个段落的行距是否设置为该片段的最高高度?在了解可能发生的所有要求之前,不可能准确回答。
标签: xsl-fo apache-fop