簡體   English   中英

如何在使用Apache FOP呈現的XSL-FO文檔中檢測溢出或換行符

[英]How to detect overflow or line breaks in XSL-FO document rendered with Apache FOP

我有一個非常簡單的FO文檔:

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
  <fo:simple-page-master master-name="A4">
    <fo:region-body margin-top="30mm" />
  </fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="A4">
  <fo:flow flow-name="xsl-region-body">
    <fo:block-container height="10mm" font-size="8mm" overflow="error-if-overflow" wrap-option="wrap">
      <fo:block wrap-option="wrap">Hello W3Schools Hello W3Schools Hello W3Schools sad da sadasd dsaasd</fo:block>
    </fo:block-container>
  </fo:flow>
</fo:page-sequence>
</fo:root>

overflow設置為error-if-overflow ,呈現此文檔時會出錯。 有什么方法可以檢測文本中的溢出位置? 我希望能夠手動將文本分成多部分,但是我不希望一次刪除一個單詞並重新運行渲染以查看其是否再次失敗的想法。

得到的異常是:

Content overflows the viewport of an fo:block-container in block-progression direction by 26078 millipoints. Content will be clipped. (See position 12:103)

不幸的是,這是發生錯誤的block-container標簽的位置,而不是造成溢出的特定單詞。

tl; dr版本:

您可以使用FOP的“中間格式”功能來創建生成的頁面和區域的XML表示 ,而不是創建PDF輸出。

然后,您可以將其用作輸入

  • 檢查是否發生溢出
  • 檢查第一行中將放置多少個字符(和/或哪個文本 ),以便您可以手動修改輸入文件
  • 自動重寫您的輸入文件,以便將溢出的文本放置在其他塊中(這將變得不那么瑣碎)

更多細節:

您可以使用以下命令從命令行創建區域樹(AT)輸出

fop input.fo -at application/pdf at.xml

或者您可以使用創建中間格式(IF)輸出

fop input.fo -if application/pdf if.xml

FOP的站點上有有關如何使用Java代碼以編程方式產生中間格式輸出的詳細信息)。

例如,如果您輸入的FO文件包含

<!--
there is no need for the wrap-option="wrap" attributes, as that is the default value, 
I added an id attribute on the fo:block-container
-->
<fo:block-container id="foo" height="10mm" font-size="8mm" overflow="error-if-overflow">
  <fo:block>Hello W3Schools Hello W3Schools Hello W3Schools sad da sadasd dsaasd</fo:block>
</fo:block-container>

IF輸出(比AT的輸出少一些)是這樣的:

...
<page index="0" name="1" page-master-name="A4" width="594720" height="792000">
    <page-header/>
    <content>
        <viewport transform="translate(0,85039)" width="594720" height="706961">
            <viewport width="594720" height="28346" clip-rect="0 0 594720 28346">
                <font family="sans-serif" style="normal" weight="400" variant="normal" size="22677" color="#000000"/>
                <id name="foo"/>
                <text x="0" y="19400">Hello W3Schools Hello W3Schools Hello W3Schools sad</text>
                <text x="0" y="46612">da sadasd dsaasd</text>
            </viewport>
        </viewport>
    </content>
    <page-trailer/>
</page>
...

XPath //viewport[id[@name = 'foo']]/text[1]為您提供第一行的文本內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM