最新消息:20210917 已从crifan.com换到crifan.org

【已解决】docbook生成pdf过程中,出现了很奇怪的这个之前就遇到过的错误:WARNING: Line 1 of a paragraph overflows the available area by 4120 millipoints. (See position 5545:25)

Docbook crifan 1787浏览 0评论

【问题】

docbook编译生成pdf过程中出现警告:

Jun 13, 2012 11:17:28 AM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Line 1 of a paragraph overflows the available area by 4120 millipoints. (See position 5545:25)

【解决过程】

1.关于此类overflow的问题,之前就遇到过的,但是都被解决掉了:

【部分解决】docbook的programlisting中,单行的连续字符太长,超出pdf边界

但是此处后经查证,却不是普通的超出边界的问题。

2。去找了对应的fo中错误的位置:

5545_25_overflow

可以看出,此处很奇怪是,就是一个普通的:

<fo:block>10.</fo:block>

又不是很长的字符串,为何还会overflow。

对应的源码为:

            <listitem><emphasis></emphasis>
                <para></para>
                <para></para>
                <para></para>
            </listitem>
            <listitem><emphasis></emphasis>
                <para></para>
                <para></para>
                <para></para>
            </listitem>
            <listitem><emphasis>把system的图片统一提取出去</emphasis>
                <para></para>
                <para></para>
                <para></para>
            </listitem>
            <listitem><emphasis>把css统一提取出去</emphasis>
                <para></para>
                <para></para>
                <para></para>
            </listitem>

怀疑可能是空的emphasis或listitem所导致的,所以先删除掉空的项,试试。

3.然后去掉上述emphasis后,问题依旧。

4.去掉整个空的listitem后,然后对应有警告的位置,就没了,然后剩下的别的空的listitem还是有对应的此种警告的,所以又去把所有的空的listitem都删除掉,然后所有的此overflow的warning都消失了。

【总结】

如果docbook中,有类似于这样的:

<listitem><emphasis></emphasis>
    <para></para>
    <para></para>
    <para></para>
</listitem>

的空的listitem,则会导致编译pdf出现警告:

WARNING: Line 1 of a paragraph overflows the available area by 4120 millipoints. (See position 5545:25)

所以解决办法很简单,就是删除掉此种空的listitem即可

【后记1】

后来证实,上述的解决办法,是错误的。

因为定位问题原因,就找错了。

真正的问题的原因,是由于listitem中,索引标号,大于等于10之后,

要在编号位置显示的内容,是编号加上一个小点,比如:

10.

而此处编号位置的显示宽度,只有两个字符,所以才提示overflow,超出显示区域的:

large than 10 label overflow

而之前的小于10,都可以正常显示,也是因为是单个的数字加上对应的点,所以没有超过显示区域,所以是正常的。

接下来,就是要解决这个,itemlist的label显示超边界的问题了。

【解决过程】

1.相关有问题的fo源码为:

            <fo:list-item-label end-indent="label-end()">
              <fo:block>10.</fo:block>
            </fo:list-item-label>

然后就去找找,到底是哪里定义了fo:list-item-label部分的显示宽度的。

2.找到了对应的xsl中的代码:

docbook-xsl-ns-1.77.0\fo\lists.xsl

中的:

<xsl:template match="d:itemizedlist/d:listitem">
  <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>

  <xsl:variable name="keep.together">
    <xsl:call-template name="pi.dbfo_keep-together"/>
  </xsl:variable>

  <xsl:variable name="item.contents">
    <fo:list-item-label end-indent="label-end()" xsl:use-attribute-sets="itemizedlist.label.properties">
      <fo:block>
        <xsl:call-template name="itemizedlist.label.markup">
          <xsl:with-param name="itemsymbol">
            <xsl:call-template name="list.itemsymbol">
              <xsl:with-param name="node" select="parent::d:itemizedlist"/>
            </xsl:call-template>
          </xsl:with-param>
        </xsl:call-template>
      </fo:block>
    </fo:list-item-label>
...
  </xsl:variable>
...
</xsl:template>

3.所以再去找对应的itemizedlist.label.properties,找到了官网中的解释:

Print properties for itemizedlist

但是没有找到解决办法。

4.后来找到了:

itemizedlist.label.width

然后去找找此设置的默认值,其网上的解释,和此处的

docbook-xsl-ns-1.77.0\fo\param.xsl

中的参数的默认配置:

<xsl:param name="itemizedlist.label.width">1.0em</xsl:param>

的确也是一样的。

所以,此处就是去更改此值,试试。

<xsl:param name="itemizedlist.label.width">2.0em</xsl:param>

结果问题依旧。

5.然后就去看看为何此设置没有生效。

同样在lists.xsl中,对于itemizedlist.label.width只找到了这里有使用该参数:

<xsl:template match="d:itemizedlist">
...
  <xsl:variable name="pi-label-width">
    <xsl:call-template name="pi.dbfo_label-width"/>
  </xsl:variable>

  <xsl:variable name="label-width">
    <xsl:choose>
      <xsl:when test="$pi-label-width = ''">
        <xsl:value-of select="$itemizedlist.label.width"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$pi-label-width"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
...
</xsl:template>

然后就又去找pi-label-width,找到了这里:

<xsl:template match="d:orderedlist">
...
  <xsl:variable name="pi-label-width">
    <xsl:call-template name="pi.dbfo_label-width"/>
  </xsl:variable>

  <xsl:variable name="label-width">
    <xsl:choose>
      <xsl:when test="$pi-label-width = ''">
        <xsl:value-of select="$orderedlist.label.width"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$pi-label-width"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
...
</xsl:template>

而突然发现,我此处的label超边界,是属于orderedlist中的label,因为有编号,所以才会有编号超过10遇到此问题的。

所以就去试试,找找对应的orderedlist.label.width默认设置。

同样的找到这里:orderedlist.label.width,其默认设置为1.2em(支持2个字符),此处改为对应的1.8em,就可以支持3个字符了(编号除非超过99,否则足够用了):

<xsl:param name="orderedlist.label.width">1.8em</xsl:param>

然后结果的确可以解决此问题,没有了对应的overflow的警告了。

然后pdf中显示效果如下:label support 3 char, so no overflow

【总结】

问题原因:

itemlist中,由于是orderedlist,所以有编号产生。

而编号超过10的话,导致编号加上一个点“.”字符,共有3个字符的宽度,超过了默认的宽度设置,其为1.2em大概是2个字符的宽度。

解决办法:将orderedlist.label.width从默认的1.2em改为1.8em,就可以支持不大于99的编号都不会出现overflow的警告,都不会显示溢出了:

<xsl:param name="orderedlist.label.width">1.8em</xsl:param>

转载请注明:在路上 » 【已解决】docbook生成pdf过程中,出现了很奇怪的这个之前就遇到过的错误:WARNING: Line 1 of a paragraph overflows the available area by 4120 millipoints. (See position 5545:25)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.192 seconds, using 23.60MB memory