【问题】
折腾docbook过程中,用fop将fo转换为pdf过程中,最后出现警告:
五月 12, 2012 2:51:53 下午 org.apache.fop.events.LoggingEventListener processEvent 警告: Line 2 of a paragraph overflows the available area by 28837 millipoints. (See position 105:749)
【解决过程】
1.参考了:Troubleshooting Common Log Messages,
没帮助。
2.后来根据错误信息:See position 105:749,然后去看了原fo文件,找到对应的地方:
<fo:inline><fo:basic-link external-destination="url(https://www.crifan.com/mplayer-10rc1_and_mplayer-10rc2_fixed_the_vbr_patch_mad_play_vbr_mp3_player_displays_the_total_length_of_the_problem/)" color="blue" text-decoration="underline">MPlayer-1.0rc1 和 MPlayer-1.0rc2 的VBR patch【已修复mad播放VBR MP3播放总时长显示问题】</fo:basic-link><fo:footnote><fo:inline font-family="微软雅黑" font-size="75%" font-weight="normal" font-style="normal" baseline-shift="super">2</fo:inline><fo:footnote-body font-family="微软雅黑" font-size="8pt" font-weight="normal" font-style="normal" text-align="justify" start-indent="0pt" text-indent="0pt" hyphenate="false" wrap-option="wrap" linefeed-treatment="treat-as-space"><fo:block><fo:inline font-family="微软雅黑" font-size="75%" font-weight="normal" font-style="normal" baseline-shift="super">2</fo:inline> <fo:basic-link external-destination="url(https://www.crifan.com/mplayer-10rc1_and_mplayer-10rc2_fixed_the_vbr_patch_mad_play_vbr_mp3_player_displays_the_total_length_of_the_problem/)">https://www.crifan.com/mplayer-10rc1_and_mplayer-10rc2_fixed_the_vbr_patch_mad_play_vbr_mp3_player_displays_the_total_length_of_the_problem/</fo:basic-link></fo:block></fo:footnote-body></fo:footnote></fo:inline> |
其对应的生成的pdf中的效果为:
3. 后来自己折腾,手动去改了原先的fo,把其中的text-align="justify改为text-align="left",然后效果看起来,至少变好了一点:
但是想要的效果是,让其从左到右的填满,超过了右边边界,然后再wrap回来,而不是都跑第二行了。
4. 看到了其中有很多选项,其中有wrap-option,所以就去找相关的解释,然后找到这里:
Apache™ FOP Compliance Page –> 7.16.13 "wrap-option"
根据其解释,去尝试一下,no-wrap的效果,然后果不其然,超出了边界:
5. 然后又去试了试把hyphenate="false"改为hyphenate="true",结果和上面效果一样,还是都跑到第二行了。
关于上述几个参数,这里:XSL-FO fop. Long text flows into adjacent cells/block, obscuring stuff there,也都提及到了。
6. 然后又参考:7.16.7 "linefeed-treatment"去尝试改为treat-as-zero-width-space,结果效果依旧。
7. 另外,想要去添加overflow="scroll",但是看到这里:xls-fo fop 0.94 Using the keep-together with wrap-option=“wrap”,也解释了,对于此处的overflow="scroll",FOP是无效果的,所以也就不用折腾这个了。
8. 然后又尝试,将linefeed-treatment="treat-as-space"改为linefeed-treatment="preserve",效果依旧。
9.添加了overflow="hidden",效果依旧。
10. 继续参考这里:XSL-FO: Force Wrap on Table Entries,想办法添加zero-width space character,
参考:3.8. Text overflowing table cells and the like is not clipped. Long text flows into adjacent cells/block, obscuring stuff there.,去添加了一个​,变成了:
<bibliosource><ulink url="https://www.crifan.com/mplayer-10rc1_and_mplayer-10rc2_fixed_the_vbr_patch_mad_​play_vbr_mp3_player_displays_the_total_length_of_the_problem/">MPlayer-1.0rc1 和 MPlayer-1.0rc2 的VBR patch【已修复mad播放VBR MP3播放总时长显示问题】</ulink></bibliosource>
然后再重新生成fo,再改为text-align="left",然后得到了如下的效果:
总体来看,这个换行的效果还行。
也就意味着,如果以后遇到类似的paragraph overflows the available area 的警告,那么就可以在合适的位置,插入一个零宽度空字符(zero-width space character),这样,fop去处理的时候,就可以换行了,就可以实现所要的效果了。
经过尝试,最后改的代码为:
<bibliosource><ulink url="https://www.crifan.com/mplayer-10rc1_and_mplayer-10rc2_fixed_the_vbr_patch_mad_play_vbr_mp3_player_displays_​the_total_length_of_the_problem/">MPlayer-1.0rc1 和 MPlayer-1.0rc2 的VBR patch【已修复mad播放VBR MP3播放总时长显示问题】</ulink></bibliosource>
对应的效果为:
总体来说,效果还凑合,基本实现了所想要的效果。
但是很明显,此办法只是属于临时性的解决问题,以后有类似的太长的行,还需要手动去插入对应的特殊字符,所以还是很麻烦的,治标不治本的。
【总结】
目前的临时的解决办法是,在代码的合适的位置,插入零宽度空字符(zero-width space character == ​),然后fop处理的时候,就可以去换行了,否则字符串太长,没法换行,即使换行,也是跑到下一行去,效果很难看。
但是此办法,还是需要手动干预,很不方便,等待以后找到更好的办法,可以支持自动换行,且原先的行,是充满到最右边的,然后超出部分,自动换到下一行中,左对齐。
转载请注明:在路上 » 【基本解决】Docbook中,用fop将fo转换为pdf过程中出现警告:Line xxx of a paragraph overflows the available area by xxx millipoints. (See position xxx:xxx)