Apache FOP不会包装我的文本

时间:2013-07-08 14:57:08

标签: pdf pdf-generation xsl-fo apache-fop docbook

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


版本: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>

2 个答案:

答案 0 :(得分:3)

为了获得字符串换行,您必须在该行中包含易碎的字符 考虑通过在特定位置插入零宽度空格字符&#x200b;&#8203;)来预处理输入。格式化程序将看到它,并且只在必要时才会破坏这些字符的行。其他出现的这种角色将不会出现。

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

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

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

答案 1 :(得分: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;的索引,然后在字符串的剩余部分调用相同的函数。