XSL-FO 后备箱。长文本流入相邻的单元格/块,掩盖那里的东西

Posted

技术标签:

【中文标题】XSL-FO 后备箱。长文本流入相邻的单元格/块,掩盖那里的东西【英文标题】:XSL-FO fop. Long text flows into adjacent cells/block, obscuring stuff there 【发布时间】:2011-05-14 06:15:24 【问题描述】:

谁能给我一个方法来让长词(比如序列号)被包装起来?我尝试了一些商业软件,没有这样的问题。是 fop 错误还是可能有可用的解决方案?

我不能在文档中每个单词的每个字符后插入零长度空格。这个解决方案对我来说听起来很疯狂。

【问题讨论】:

【参考方案1】:

您可以像这样在fo:block 中指定 wrap-option 属性:

<fo:block wrap-option="wrap"> ... stuff </fo:block>

这是该属性的 XSL-FO 规范:

XSL 定义:

:不换行 |换行 |继承

首字母:换行

适用于:fo:block, fo:inline, fo:page-number, fo:页码引用

继承:是的

百分比:不适用

媒体:视觉

值的含义如下:

无包装

不会执行换行。

如果行长于 的可用宽度 内容矩形,溢出将 按照规定进行处理 上指定的“溢出”属性 参考区域。

换行

如果 行溢出可用块 宽度。没有特殊标记或其他 会进行治疗。

指定如何换行 (换行)的内容 格式化对象将被处理。

实现必须支持 "no-wrap" 值,如此定义 推荐,当值 “换行处理”是“保留”。

您还可以在fo:table-cell 中定义wrap-option 属性

<fo:table-cell wrap-option="wrap"> ... </fo:table-cell>

并且其中的fo:blocks 将继承该属性。

【讨论】:

wrap-option="wrap" 告诉格式化程序执行换行,但不能保证换行会找到合适的地方换行符;此外,wrap 是默认属性值,因此通常不需要显式设置。【参考方案2】:

Zkoh 的回答(换行)仅在文本包含多个由空格分隔的单词时才会为您提供帮助。在长词的情况下(如所讨论的那样),断字是可行的(正如丹尼尔所建议的那样)。

FOP 中的断字可能会出现很多问题:

    FOP 使用来自 TeX 的连字符算法,并且由于某些许可问题,这些算法(至少对于某些语言而言)不是标准 FOP 二进制分发的一部分(如 here 所述)并且必须从OFFO web site 单独下载。网站上有两种断字模式文件。 XML 格式(需要首先编译才能与 FOP 一起使用)和 JAR 文件(已编译)。一定要下载编译版!安装很简单,well documented - 只需将 OFFO 二进制文件放到 FOP 的 lib 文件夹中即可... 不要忘记指定文档的语言,如果需要,在块级别启用连字符(它继承,所以将它添加到根元素,你应该没问题) - 见FOP FAQ

【讨论】:

这应该是公认的答案。此处指定的 OFFO 网站已关闭,这是另一个指向 OFFO 的链接。此外,如前所述,应该将语言 xml:lang="en" 添加到文件的根目录中(这很难弄清楚......)。【参考方案3】:

断字能解决您的问题吗?您应该能够使用hyphenate="true" 属性启用断字。此属性的位置取决于您要启用连字的位置。

这是 FOP 连字合规性的链接:Apache FOP Compliance Page

这里是 XSL 规范的链接:XSL Spec #hyphenate

如果没有,您可能需要尝试一些保留属性(例如keep-together.within-line)。

【讨论】:

【参考方案4】:

使用 keep-together.within-column="always" 而不是 keep-together="always" of 在表格单元格中保留长行。

【讨论】:

【参考方案5】:

问题是关于序列号,而不是字典单词。指定hyphenate="true" 仅在断字字典或断字算法可以成功断字文本中的单词时才有用。序列号很少会生成可以像单词一样有用连字符的序列。

当然,您可以使用 XSLT 在表格单元格的文本中添加零宽度空格,而不是手动进行。 *** 喜欢重复的问题(请参阅https://***.blog/2010/11/16/dr-strangedupe-or-how-i-learned-to-stop-worrying-and-love-duplication/),但是,请参阅XSL-FO: Force Wrap on Table Entries 中的答案。

【讨论】:

【参考方案6】:

对于文本溢出问题使用keep-together="auto"属性。

文本溢出问题

使用keep-together="auto"属性后的固定版本。

【讨论】:

以上是关于XSL-FO 后备箱。长文本流入相邻的单元格/块,掩盖那里的东西的主要内容,如果未能解决你的问题,请参考以下文章

如何检测是不是在多个彼此不相邻的单元格中删除了文本

如何避免在页面之间拆分单元格的内容?

与相邻单元格的特定元素对齐

如何使用jQuery选择相邻的表格单元格

在集合视图中显示长单元格(如矩形)的问题

获取相邻列中最近的非空单元格的行索引(Excel)