iwasaki
iwasaki

Reputation: 77

XSL-FO 3 pages flow

I using XSLT and XML to create XSL-FO, from where to generate PDFs. The engine used is supporting only XSLT1.0.

I am trying to set up a layout that will be like this:

The issue I am facing is setting up the flow, in order to met the following:

Is that even possible to achieve this? How will I need to set up the Page Sets/Layouts? Thanks!

My simplified XSLFO I tried with, but is not meeting all above conditions:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="Page01">
            <fo:region-body region-name="Body"/>
            <fo:region-after region-name="Page01Footer"/>
        </fo:simple-page-master>

        <fo:simple-page-master master-name="Page02">
            <fo:region-body region-name="Body"/>
            <fo:region-after region-name="Page02Footer"/>
        </fo:simple-page-master>

        <fo:simple-page-master master-name="AllPages">
            <fo:region-body region-name="Body"/>
            <fo:region-after region-name="AllPagesFooter"/>
        </fo:simple-page-master>

        <fo:page-sequence-master master-name="PagSeqMaster">
            <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
                <fo:conditional-page-master-reference master-reference="Page01"
                                                      page-position="first"/>
                <fo:conditional-page-master-reference master-reference="Page02"
                                                      blank-or-not-blank="blank"/>
                <fo:conditional-page-master-reference master-reference="AllPages"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>

        <fo:page-sequence-master master-name="PagSeqMaster-alt">
            <fo:single-page-master-reference master-reference="Page01"/>
            <fo:single-page-master-reference master-reference="Page02"/>
            <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
                <fo:conditional-page-master-reference master-reference="AllPages"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
    </fo:layout-master-set>

    <fo:page-sequence master-reference="PagSeqMaster">
        <fo:static-content flow-name="Page01Footer">
            <fo:block>Footer 01</fo:block>
        </fo:static-content>

        <fo:static-content flow-name="Page02Footer">
            <fo:block>Footer 02  </fo:block>
        </fo:static-content>
        <fo:static-content flow-name="AllPagesFooter">
            <fo:block>All Other Pages Footer</fo:block>
        </fo:static-content>
        
        <fo:flow flow-name="Body">
            <fo:block>
                repeating table content starting on page 1 goes here
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Upvotes: 0

Views: 198

Answers (1)

Tony Graham
Tony Graham

Reputation: 8068

You can do it with AH Formatter by generating a zero-height float on the second page using the axf:float-move extension (see https://www.antenna.co.jp/AHF/help/en/ahf-float.html#axf.float-move). The float causes a blank-looking page after a one-page table and doesn't interfere with a two-page or three-page table.

<?xml version="1.0" encoding="UTF-8"?>
<fo:root
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="Page01">
      <fo:region-body region-name="Body"/>
      <fo:region-after region-name="Page01Footer"
               extent="1in" />
    </fo:simple-page-master>

    <fo:simple-page-master master-name="Page02">
      <fo:region-body region-name="Body"/>
      <fo:region-after region-name="Page02Footer"
               extent="1in" />
    </fo:simple-page-master>

    <fo:simple-page-master master-name="AllPages">
      <fo:region-body region-name="Body"/>
      <fo:region-after region-name="AllPagesFooter"
               extent="1in" />
    </fo:simple-page-master>

    <fo:page-sequence-master master-name="TableMaster">
      <fo:single-page-master-reference master-reference="Page01"/>
      <fo:single-page-master-reference master-reference="Page02"/>
      <fo:repeatable-page-master-reference master-reference="AllPages"/>
    </fo:page-sequence-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="TableMaster">
    <fo:static-content flow-name="Page01Footer">
      <fo:block>Footer 01</fo:block>
    </fo:static-content>
    <fo:static-content flow-name="Page02Footer">
      <fo:block>Footer 02  </fo:block>
    </fo:static-content>
    <fo:static-content flow-name="AllPagesFooter">
      <fo:block>All Other Pages Footer</fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="Body">
      <fo:float float="before" axf:float-move="next"><fo:block/></fo:float>
      <fo:block>
        repeating table content starting on page 1 goes here
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

  <fo:page-sequence master-reference="AllPages">
    <fo:static-content flow-name="AllPagesFooter">
      <fo:block>All Other Pages Footer</fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="Body">
      <fo:block>
        rest of content goes here
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

  <fo:page-sequence master-reference="TableMaster">
    <fo:static-content flow-name="Page01Footer">
      <fo:block>Footer 01</fo:block>
    </fo:static-content>
    <fo:static-content flow-name="Page02Footer">
      <fo:block>Footer 02  </fo:block>
    </fo:static-content>
    <fo:static-content flow-name="AllPagesFooter">
      <fo:block>All Other Pages Footer</fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="Body">
      <fo:float float="before" axf:float-move="next"><fo:block/></fo:float>
      <fo:block>
        repeating table content starting on page 1 goes here
      </fo:block>
      <fo:block break-before="page">
        repeating table content on page 2 goes here
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

  <fo:page-sequence master-reference="AllPages">
    <fo:static-content flow-name="AllPagesFooter">
      <fo:block>All Other Pages Footer</fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="Body">
      <fo:block>
        rest of content goes here
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

  <fo:page-sequence master-reference="TableMaster">
    <fo:static-content flow-name="Page01Footer">
      <fo:block>Footer 01</fo:block>
    </fo:static-content>
    <fo:static-content flow-name="Page02Footer">
      <fo:block>Footer 02  </fo:block>
    </fo:static-content>
    <fo:static-content flow-name="AllPagesFooter">
      <fo:block>All Other Pages Footer</fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="Body">
      <fo:float float="before" axf:float-move="next"><fo:block/></fo:float>
      <fo:block>
        repeating table content starting on page 1 goes here
      </fo:block>
      <fo:block break-before="page">
        repeating table content on page 2 goes here
      </fo:block>
      <fo:block break-before="page">
        repeating table content on page 3 goes here
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

  <fo:page-sequence master-reference="AllPages">
    <fo:static-content flow-name="AllPagesFooter">
      <fo:block>All Other Pages Footer</fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="Body">
      <fo:block>
        rest of content goes here
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Upvotes: -1

Related Questions