2013-07-08 36 views
2

我想要一段文本在下一行溢出时换行。文本没有空格或破折号。即使该块包含overflow =“hidden”和wrap-option =“wrap”属性,Apache FOP也不会包装此文本或将其剪下。 FO文件不包含任何保持在一起的设置,因此不会导致此问题。Apache FOP不会包装我的文本


版本:Apache FOP 0.95,1.0和1.1发生问题。不幸的是,旧版本不能在我的DocBook Maven安装程序中工作,所以我没有测试过这些。


这是我的FO文件块:

<fo:block 
overflow="hidden" 
wrap-option="wrap" 
white-space-collapse="false" 
white-space-treatment="preserve" 
linefeed-treatment="preserve" 
text-align="start" 
margin-top="0.5em" 
margin-right="0.5pt" 
margin-bottom="1em" 
margin-left="0.5pt" 
border-width="0.5pt" 
border-left-style="solid" 
border-left-color="#D3CEC6" 
padding="2mm" 
font-family="Courier New" 
font-size="8pt" 
background-color="#EBE5D7">veryverylongtextwithoutspacesordashes 
</fo:block> 

回答

3

为了得到字符串包裹,你必须有行内易碎字符。
考虑通过在某些地方插入零宽度空格字符&#x200b;&#8203;)来预处理您的输入。格式化程序会看到它,只会在必要时在这些字符处断行。这个角色的其他出现将不会被看到。

<fo:block>very&#x200b;very&#x200b;long&#x200b;text&#x200b;without&#x200b;spaces&#x200b;or&#x200b;dashes</fo:block> 

如果文本是一串数字,在每第n个符号处插入零宽度空格字符可能是合乎逻辑的。

或者,您可以将您的格式化程序设置为连字符根据特定语言的连字规则的字符串。实际上,连字符本质上是基于在原始文本中添加连字标记。同样,它需要字符串包含属于某种语言的有意义的文本。

0

这可能是旧的,但我遇到了这个,并写了一个FOP函数来解决我的问题。

<#function breakValue value limit> 
    <#if value?length lte limit> 
    <#return value> 
    <#else> 
    <#return value?substring(0, limit) + "&#x200b;" + breakValue(value?substring(limit))> 
    </#if> 
</#function> 

其中value是要打破和limit字符串是要添加&#x200b;然后调用字符串的其余相同功能的指标。