Search code examples
xsl-foapache-fop

Retrieve markers on different pages (first, last, and intermediate)


My XSL code:

            <fo:layout-master-set>

                <fo:simple-page-master master-name="page-even" page-height="210mm" page-width="148mm"> 
                    <fo:region-body region-name="xsl-region-body" margin="28mm 8mm 10mm 2mm" />
                    <fo:region-before region-name="xsl-region-before-even"/>
                    <fo:region-after region-name="xsl-region-after-even" extent="12mm"/>
                </fo:simple-page-master>

                <fo:simple-page-master master-name="page-odd" page-height="210mm" page-width="148mm"> 
                    <fo:region-body region-name="xsl-region-body" margin="28mm 2mm 10mm 8mm" />
                    <fo:region-before region-name="xsl-region-before-odd"/>
                    <fo:region-after region-name="xsl-region-after-odd" extent="12mm"/>
                </fo:simple-page-master>

                 <fo:simple-page-master master-name="last-page-even" page-height="210mm" page-width="148mm">
                    <fo:region-body />
                    <fo:region-before region-name="header-blank" extent="210mm"/>
                    <fo:region-after region-name="xsl-region-after-even" extent="12mm"/>
                </fo:simple-page-master>

                <fo:page-sequence-master master-name="document">
                    <fo:repeatable-page-master-alternatives>
                        <fo:conditional-page-master-reference odd-or-even="odd" master-reference="page-odd" blank-or-not-blank="not-blank"/>
                        <fo:conditional-page-master-reference odd-or-even="even" master-reference="page-even" blank-or-not-blank="not-blank"/>
                        <fo:conditional-page-master-reference blank-or-not-blank="blank" odd-or-even="even" master-reference="last-page-even"/>
                    </fo:repeatable-page-master-alternatives>
                </fo:page-sequence-master>

            </fo:layout-master-set>

                <fo:page-sequence master-reference="document" force-page-count="end-on-even" id="TheVeryLastPage">

                    <!--Headers-->
                    <fo:static-content flow-name="xsl-region-before-odd">
                        <fo:block font-weight="normal" font-family="Helvetica" text-align="center" margin="6mm 2mm 0mm 8mm">

                       </fo:block>
                       <fo:retrieve-marker retrieve-class-name="amarker"/>
                    </fo:static-content>

                    <fo:static-content flow-name="xsl-region-before-even">
                        <fo:block font-weight="normal" font-family="Helvetica" text-align="center" margin="6mm 8mm 0mm 2mm">

                       </fo:block>
                       <fo:retrieve-marker retrieve-class-name="amarker"/>
                    </fo:static-content>

                    <fo:static-content flow-name="header-blank">
                        <fo:block font-weight="normal" font-family="Helvetica" text-align="center" margin="6mm 8mm 0mm 2mm">

                       </fo:block>
                        <fo:block text-align-last="center" font-size="9.5" margin-top="75mm">
                             Intentionally left blank
                        </fo:block>
                        <fo:retrieve-marker retrieve-class-name="amarker"/>
                   </fo:static-content>

                    <!--Footers-->
                    <fo:static-content flow-name="xsl-region-after-odd">
                        <fo:block font-size="9pt" font-weight="normal" font-family="Helvetica" margin="0mm 2mm 0mm 8mm">

                        </fo:block>
                        <fo:retrieve-marker retrieve-class-name="amarker"/>
                    </fo:static-content>

                    <fo:static-content flow-name="xsl-region-after-even">
                        <fo:block font-size="9pt" font-weight="normal" font-family="Helvetica" margin="0mm 8mm 0mm 2mm">

                        </fo:block>
                        <fo:retrieve-marker retrieve-class-name="amarker"/>
                    </fo:static-content>

                    <!--Body-->
                    <fo:flow flow-name="xsl-region-body">
                        <fo:block-container font-size="9.5pt" font-weight="normal" font-family="Helvetica">
                            <fo:block>
                                <fo:marker marker-class-name="amarker">
                                    <fo:block>xxx</fo:block>
                                </fo:marker>
                            </fo:block>

                        </fo:block-container>
                    </fo:flow>

I'm trying to put "Continued on the following page" label on the footer whenever the page breaks (but not when the next page is Intentionally left blank) and "Continued from the previous page" label whenever previous page broke (but not when the page is Intentionally left blank).

I tried many things, but nothing seems to give me the desired output.

I'm using Apache Fop.

Any help will be appreciated.


Solution

  • It's not so easy...

    Here's a solution, which works with FOP (I found another that performed well with Antenna House but not with Apache FOP):

    It was also necessary to set a specific footer for your Intentionally left blank; I have written down some comment in the code; don't hesitate if you have further questions.

    Please note:

    1. be careful where you add the <fo:marker>s ; they need to be inserted as the first child(ren) of the <fo:block>s.
    2. there is a special processing for the first block to be output.

    <fo:layout-master-set>
    
        <fo:simple-page-master master-name="page-even" page-height="210mm" page-width="148mm">
            <fo:region-body region-name="xsl-region-body" margin="28mm 8mm 10mm 2mm"/>
            <fo:region-before region-name="xsl-region-before-even" extent="12mm"/>
            <fo:region-after region-name="xsl-region-after-even" extent="12mm"/>
        </fo:simple-page-master>
    
        <fo:simple-page-master master-name="page-odd" page-height="210mm" page-width="148mm">
            <fo:region-body region-name="xsl-region-body" margin="28mm 2mm 10mm 8mm"/>
            <fo:region-before region-name="xsl-region-before-odd" extent="12mm"/>
            <fo:region-after region-name="xsl-region-after-odd" extent="12mm"/>
        </fo:simple-page-master>
    
        <fo:simple-page-master master-name="last-page-even" page-height="210mm" page-width="148mm">
            <fo:region-body/>
            <fo:region-before region-name="header-blank" extent="210mm"/>
            <!-- created a specific footer for the conditionally inserted page -->
            <fo:region-after region-name="footer-blank" extent="12mm"/>
        </fo:simple-page-master>
    
        <fo:page-sequence-master master-name="document">
            <fo:repeatable-page-master-alternatives>
                <fo:conditional-page-master-reference odd-or-even="odd" master-reference="page-odd"
                    blank-or-not-blank="not-blank"/>
                <fo:conditional-page-master-reference odd-or-even="even"
                    master-reference="page-even" blank-or-not-blank="not-blank"/>
                <fo:conditional-page-master-reference blank-or-not-blank="blank" odd-or-even="even"
                    master-reference="last-page-even"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
     </fo:layout-master-set>
    
      <fo:page-sequence master-reference="document" force-page-count="end-on-even" id="TheVeryLastPage">
            <!-- Headers -->
        <fo:static-content flow-name="xsl-region-before-odd">
            <fo:block font-weight="normal" font-family="Helvetica" text-align="center"
                margin="6mm 2mm 0mm 8mm"> </fo:block>
            <fo:retrieve-marker retrieve-class-name="continued"
                retrieve-position="first-starting-within-page" retrieve-boundary="page-sequence"/>
        </fo:static-content>
    
        <fo:static-content flow-name="xsl-region-before-even">
            <fo:block font-weight="normal" font-family="Helvetica" text-align="center"
                margin="6mm 8mm 0mm 2mm"> header even </fo:block>
            <fo:retrieve-marker retrieve-class-name="continued"
                retrieve-position="first-starting-within-page" retrieve-boundary="page-sequence"/>
        </fo:static-content>
    
        <fo:static-content flow-name="header-blank">
            <fo:block font-weight="normal" font-family="Helvetica" text-align="center"
                margin="6mm 8mm 0mm 2mm"> </fo:block>
            <fo:block text-align-last="center" font-size="18" font-weight="bold">Intentionally left
                blank
            </fo:block>
        </fo:static-content>
    
        <!--Footers-->
        <fo:static-content flow-name="xsl-region-after-odd">
            <fo:block font-size="9pt" font-weight="normal" font-family="Helvetica"
                margin="0mm 2mm 0mm 8mm"> </fo:block>
            <fo:retrieve-marker retrieve-class-name="tobefollowed"
                retrieve-position="last-ending-within-page" retrieve-boundary="page-sequence"/>
        </fo:static-content>
    
        <fo:static-content flow-name="xsl-region-after-even">
            <fo:block font-size="9pt" font-weight="normal" font-family="Helvetica"
                margin="0mm 8mm 0mm 2mm"> </fo:block>
            <fo:retrieve-marker retrieve-class-name="tobefollowed"
                retrieve-position="last-ending-within-page" retrieve-boundary="page-sequence"/>
        </fo:static-content>
    
        <fo:static-content flow-name="footer-blank">
            <fo:block font-size="9pt" font-weight="normal" font-family="Helvetica"
                margin="0mm 8mm 0mm 2mm"> </fo:block>
        </fo:static-content>
    
        <!--Body-->
        <fo:flow flow-name="xsl-region-body" font-size="9.5pt" font-weight="normal"
            font-family="Helvetica">
    
    
            <fo:block>
                <!-- set up the first marker as empty, in order to have nothing of the first page -->
                <fo:marker marker-class-name="continued"><fo:block><!-- No text --></fo:block></fo:marker>
                <!-- Prepare to insert "to be continued" -->
                <fo:marker marker-class-name="tobefollowed">
                    <fo:block>Continued on the following page</fo:block>
                </fo:marker>
            </fo:block>
            <!-- !!!! FIRST BLOCK !!!! -->
            <fo:block>
                <!-- the other pages may have "continued" mentined in the header --> 
                <fo:marker marker-class-name="continued"><fo:block>Continued from the previous page</fo:block></fo:marker>
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla suscipit sem
                ut sollicitudin imperdiet. Donec pulvinar arcu quis diam scelerisque vestibulum.
                Curabitur et rhoncus ipsum, at molestie tellus. Vestibulum ante ipsum primis in
                faucibus orci luctus et ultrices posuere cubilia Curae; Integer vitae faucibus dui.
                Nullam laoreet felis a tristique varius. Proin urna tellus, dignissim ut laoreet
                eget, rhoncus non diam. In nisl nibh, ultricies malesuada nibh eu, imperdiet
                fermentum tortor. Donec id aliquam ante, ut posuere sapien. Vivamus et gravida
                velit, quis dictum libero. Suspendisse porttitor, risus quis luctus malesuada, elit
                felis sollicitudin ante, eu vestibulum justo lectus nec metus. Vestibulum nec
                bibendum dui, accumsan ultrices turpis. </fo:block>
    
                <!-- ... output all your text here ... -->
            <fo:block>
                <!-- This one is empty so that the end is not without any text -->
                <fo:marker marker-class-name="tobefollowed"><fo:block><!-- No text --></fo:block></fo:marker>
                <!-- And this one is to know that text may cut up onto different pages -->
                <fo:marker marker-class-name="continued"><fo:block>Continued from the previous page</fo:block></fo:marker>
    
            </fo:block>
        </fo:flow>
    </fo:page-sequence>