---
title: ProgressBar
order: 29
layout: page
---

[[components.progressbar]]
= ProgressBar

ifdef::web[]
[.sampler]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/interaction/progress-bar"]
endif::web[]

The [classname]#ProgressBar# component allows visualizing progress of a task.
The progress is specified as a floating-point value between 0.0 and 1.0.

[[figure.components.progressbar.basic]]
.The [classname]#ProgressBar# component
image::img/progressbar-basic.png[width=30%, scaledwidth=70%]

To display upload progress with the [classname]#Upload# component, you can
update the progress bar in a [interfacename]#ProgressListener#.

When the position of a progress bar is done in a background thread, the change
is not shown in the browser immediately. You need to use either polling or
server push to update the browser. You can enable polling with
[methodname]#setPollInterval()# in the current UI instance. See
<<dummy/../../../framework/advanced/advanced-push#advanced.push,"Server Push">>
for instructions about using server push. Whichever method you use to update the
UI, it is important to lock the user session by modifying the progress bar value
inside [methodname]#access()# call, as described in
<<dummy/../../../framework/advanced/advanced-push#advanced.push.running,"Accessing UI from Another Thread">>.

[source, java]
----
ProgressBar bar = new ProgressBar(0.0f);
layout.addComponent(bar);

layout.addComponent(new Button("Increase", click -> {
    float current = bar.getValue();
    if (current < 1.0f)
        bar.setValue(current + 0.10f);
}));
----

[[components.progressbar.indeterminate]]
== Indeterminate Mode

In the indeterminate mode, a non-progressive indicator is displayed
continuously. The indeterminate indicator is a circular wheel in the built-in
themes. The progress value has no meaning in the indeterminate mode.

[source, java]
----
ProgressBar bar = new ProgressBar();
bar.setIndeterminate(true);
----

[[figure.components.progressbar.indeterminate]]
.Indeterminate progress bar
image::img/progressbar-indeterminate.png[width=15%, scaledwidth=40%]

[[components.progressbar.thread]]
== Doing Heavy Computation

The progress bar is typically used to display the progress of a heavy
server-side computation task, often running in a background thread. The UI,
including the progress bar, can be updated either with polling or by using
server push. When doing so, you must ensure thread-safety, most easily by
updating the UI inside a [methodname]#UI.access()# call in a
[interfacename]#Runnable#, as described in
<<dummy/../../../framework/advanced/advanced-push#advanced.push.running,"Accessing
UI from Another Thread">>.


[[components.progressbar.css]]
== CSS Style Rules


[source, css]
----
.v-progressbar, v-progressbar-indeterminate {}
  .v-progressbar-wrapper {}
    .v-progressbar-indicator {}
----

The progress bar has a [literal]#++v-progressbar++# base style.
The progress is an element with [literal]#++v-progressbar-indicator++# style inside the wrapper, and therefore displayed on top of it.
When the progress element grows, it covers more and more of the animated background.

The progress bar can be animated (some themes use that).
Animation is done in the element with the [literal]#v-progressbar-wrapper# style, by having an animated GIF as the background image.

In the indeterminate mode, the top element also has the
[literal]#++v-progressbar-indeterminate++# style.
The built-in themes simply display the animated GIF in the top element and have the inner elements disabled.
n>
<option value='fop-0_20_2-maintain'>fop-0_20_2-maintain</option>
<option value='fop-0_90'>fop-0_90</option>
<option value='fop-0_91'>fop-0_91</option>
<option value='fop-0_92'>fop-0_92</option>
<option value='fop-0_93'>fop-0_93</option>
<option value='fop-0_94'>fop-0_94</option>
<option value='fop-0_95'>fop-0_95</option>
<option value='fop-1_0'>fop-1_0</option>
<option value='fop-1_1'>fop-1_1</option>
<option value='fop-1_1old'>fop-1_1old</option>
<option value='fop-1_1rc1'>fop-1_1rc1</option>
<option value='fop-2.6'>fop-2.6</option>
<option value='fop-2_0'>fop-2_0</option>
<option value='fop-2_1'>fop-2_1</option>
<option value='fop-2_10'>fop-2_10</option>
<option value='fop-2_11'>fop-2_11</option>
<option value='fop-2_2'>fop-2_2</option>
<option value='fop-2_3'>fop-2_3</option>
<option value='fop-2_4'>fop-2_4</option>
<option value='fop-2_5'>fop-2_5</option>
<option value='fop-2_6'>fop-2_6</option>
<option value='fop-2_7'>fop-2_7</option>
<option value='fop-2_8'>fop-2_8</option>
<option value='fop-2_9'>fop-2_9</option>
<option value='foray-font'>foray-font</option>
<option value='inlineblock'>inlineblock</option>
<option value='jgoncalves-pdfa-extension-fix'>jgoncalves-pdfa-extension-fix</option>
<option value='main'>main</option>
<option value='maven'>maven</option>
<option value='release-0-13-0'>release-0-13-0</option>
<option value='skynavga/configure-sonar-support'>skynavga/configure-sonar-support</option>
<option value='temp/ssteiner-java23'>temp/ssteiner-java23</option>
<option value='temp/ssteiner-pdfbox3'>temp/ssteiner-pdfbox3</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>Apache XML Graphics FOP: https://github.com/apache/xmlgraphics-fop</td><td class='sub right'>www-data</td></tr></table>
<table class='tabs'><tr><td>
<a href='/xmlgraphics-fop.git/about/?h=Temp_PDF_in_PDF'>about</a><a href='/xmlgraphics-fop.git/?h=Temp_PDF_in_PDF'>summary</a><a href='/xmlgraphics-fop.git/refs/?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>refs</a><a href='/xmlgraphics-fop.git/log/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF'>log</a><a class='active' href='/xmlgraphics-fop.git/tree/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>tree</a><a href='/xmlgraphics-fop.git/commit/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>commit</a><a href='/xmlgraphics-fop.git/diff/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>diff</a><a href='/xmlgraphics-fop.git/stats/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF'>stats</a></td><td class='form'><form class='right' method='get' action='/xmlgraphics-fop.git/log/test/layoutengine/standard-testcases/table_keep-with-next.xml'>
<input type='hidden' name='h' value='Temp_PDF_in_PDF'/><input type='hidden' name='id' value='4e921e05c7204e345525cf3e3312d8b8342d4b63'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/xmlgraphics-fop.git/tree/?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>root</a>/<a href='/xmlgraphics-fop.git/tree/test?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>test</a>/<a href='/xmlgraphics-fop.git/tree/test/layoutengine?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>layoutengine</a>/<a href='/xmlgraphics-fop.git/tree/test/layoutengine/standard-testcases?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>standard-testcases</a>/<a href='/xmlgraphics-fop.git/tree/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>table_keep-with-next.xml</a></div><div class='content'>blob: a30d7713cdd6d16f3fe13aeab515d6ff3eea278c (<a href='/xmlgraphics-fop.git/plain/test/layoutengine/standard-testcases/table_keep-with-next.xml?h=Temp_PDF_in_PDF&amp;id=4e921e05c7204e345525cf3e3312d8b8342d4b63'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
<span class="cm">&lt;!--</span>
<span class="cm">  Licensed to the Apache Software Foundation (ASF) under one or more</span>
<span class="cm">  contributor license agreements.  See the NOTICE file distributed with</span>
<span class="cm">  this work for additional information regarding copyright ownership.</span>
<span class="cm">  The ASF licenses this file to You under the Apache License, Version 2.0</span>
<span class="cm">  (the &quot;License&quot;); you may not use this file except in compliance with</span>
<span class="cm">  the License.  You may obtain a copy of the License at</span>

<span class="cm">       http://www.apache.org/licenses/LICENSE-2.0</span>

<span class="cm">  Unless required by applicable law or agreed to in writing, software</span>
<span class="cm">  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span>
<span class="cm">  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="cm">  See the License for the specific language governing permissions and</span>
<span class="cm">  limitations under the License.</span>
<span class="cm">--&gt;</span>
<span class="cm">&lt;!-- $Id$ --&gt;</span>
<span class="nt">&lt;testcase&gt;</span>
<span class="w">  </span><span class="nt">&lt;info&gt;</span>
<span class="w">    </span><span class="nt">&lt;p&gt;</span>
<span class="w">      </span>This<span class="w"> </span>test<span class="w"> </span>checks<span class="w"> </span>that<span class="w"> </span>keep-with-next<span class="w"> </span>works<span class="w"> </span>on<span class="w"> </span>tables.
<span class="w">    </span><span class="nt">&lt;/p&gt;</span>
<span class="w">  </span><span class="nt">&lt;/info&gt;</span>
<span class="w">  </span><span class="nt">&lt;fo&gt;</span>
<span class="w">    </span><span class="nt">&lt;fo:root</span><span class="w"> </span><span class="na">xmlns:fo=</span><span class="s">&quot;http://www.w3.org/1999/XSL/Format&quot;</span><span class="nt">&gt;</span>
<span class="w">      </span><span class="nt">&lt;fo:layout-master-set&gt;</span>
<span class="w">        </span><span class="nt">&lt;fo:simple-page-master</span><span class="w"> </span><span class="na">master-name=</span><span class="s">&quot;page&quot;</span><span class="w"> </span><span class="na">page-height=</span><span class="s">&quot;6cm&quot;</span><span class="w"> </span><span class="na">page-width=</span><span class="s">&quot;15cm&quot;</span>
<span class="w">          </span><span class="na">margin-top=</span><span class="s">&quot;1cm&quot;</span><span class="w"> </span><span class="na">margin-bottom=</span><span class="s">&quot;0&quot;</span><span class="w"> </span><span class="na">margin-left=</span><span class="s">&quot;1cm&quot;</span><span class="w"> </span><span class="na">margin-right=</span><span class="s">&quot;1cm&quot;</span><span class="nt">&gt;</span>
<span class="w">          </span><span class="nt">&lt;fo:region-body/&gt;</span>
<span class="w">        </span><span class="nt">&lt;/fo:simple-page-master&gt;</span>
<span class="w">      </span><span class="nt">&lt;/fo:layout-master-set&gt;</span>
<span class="w">      </span><span class="nt">&lt;fo:page-sequence</span><span class="w"> </span><span class="na">master-reference=</span><span class="s">&quot;page&quot;</span><span class="w"> </span><span class="na">font-family=</span><span class="s">&quot;serif&quot;</span><span class="w"> </span><span class="na">font-size=</span><span class="s">&quot;14pt&quot;</span><span class="nt">&gt;</span>
<span class="w">        </span><span class="nt">&lt;fo:flow</span><span class="w"> </span><span class="na">flow-name=</span><span class="s">&quot;xsl-region-body&quot;</span><span class="nt">&gt;</span>
<span class="w">          </span><span class="nt">&lt;fo:block</span><span class="w"> </span><span class="na">space-after=</span><span class="s">&quot;40pt&quot;</span><span class="nt">&gt;</span>First<span class="w"> </span>line<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">          </span><span class="nt">&lt;fo:table</span><span class="w"> </span><span class="na">width=</span><span class="s">&quot;100%&quot;</span><span class="w"> </span><span class="na">table-layout=</span><span class="s">&quot;fixed&quot;</span><span class="w"> </span><span class="na">border-collapse=</span><span class="s">&quot;separate&quot;</span><span class="w"> </span><span class="na">border=</span><span class="s">&quot;4pt solid black&quot;</span>
<span class="w">            </span><span class="na">keep-with-next=</span><span class="s">&quot;always&quot;</span><span class="w"> </span><span class="na">keep-together=</span><span class="s">&quot;always&quot;</span><span class="nt">&gt;</span>
<span class="w">            </span><span class="nt">&lt;fo:table-column</span><span class="w"> </span><span class="na">number-columns-repeated=</span><span class="s">&quot;2&quot;</span><span class="w"> </span><span class="na">column-width=</span><span class="s">&quot;proportional-column-width(1)&quot;</span><span class="nt">/&gt;</span>
<span class="w">            </span><span class="nt">&lt;fo:table-body&gt;</span>
<span class="w">              </span><span class="nt">&lt;fo:table-row&gt;</span>
<span class="w">                </span><span class="nt">&lt;fo:table-cell</span><span class="w"> </span><span class="na">border=</span><span class="s">&quot;2pt solid blue&quot;</span><span class="nt">&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>1.1<span class="w"> </span>Line<span class="w"> </span>1<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>1.1<span class="w"> </span>Line<span class="w"> </span>2<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                </span><span class="nt">&lt;/fo:table-cell&gt;</span>
<span class="w">                </span><span class="nt">&lt;fo:table-cell</span><span class="w"> </span><span class="na">border=</span><span class="s">&quot;2pt solid teal&quot;</span><span class="nt">&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>1.2<span class="w"> </span>Line<span class="w"> </span>1<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>1.2<span class="w"> </span>Line<span class="w"> </span>2<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                </span><span class="nt">&lt;/fo:table-cell&gt;</span>
<span class="w">              </span><span class="nt">&lt;/fo:table-row&gt;</span>
<span class="w">              </span><span class="nt">&lt;fo:table-row&gt;</span>
<span class="w">                </span><span class="nt">&lt;fo:table-cell</span><span class="w"> </span><span class="na">border=</span><span class="s">&quot;2pt solid green&quot;</span><span class="nt">&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>2.1<span class="w"> </span>Line<span class="w"> </span>1<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>2.1<span class="w"> </span>Line<span class="w"> </span>2<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                </span><span class="nt">&lt;/fo:table-cell&gt;</span>
<span class="w">                </span><span class="nt">&lt;fo:table-cell</span><span class="w"> </span><span class="na">border=</span><span class="s">&quot;2pt solid olive&quot;</span><span class="nt">&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>2.1<span class="w"> </span>Line<span class="w"> </span>1<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                  </span><span class="nt">&lt;fo:block&gt;</span>Cell<span class="w"> </span>2.1<span class="w"> </span>Line<span class="w"> </span>2<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">                </span><span class="nt">&lt;/fo:table-cell&gt;</span>
<span class="w">              </span><span class="nt">&lt;/fo:table-row&gt;</span>
<span class="w">            </span><span class="nt">&lt;/fo:table-body&gt;</span>
<span class="w">          </span><span class="nt">&lt;/fo:table&gt;</span>
<span class="w">          </span><span class="nt">&lt;fo:block&gt;</span>After<span class="w"> </span>the<span class="w"> </span>table<span class="nt">&lt;/fo:block&gt;</span>
<span class="w">        </span><span class="nt">&lt;/fo:flow&gt;</span>
<span class="w">      </span><span class="nt">&lt;/fo:page-sequence&gt;</span>
<span class="w">    </span><span class="nt">&lt;/fo:root&gt;</span>
<span class="w">  </span><span class="nt">&lt;/fo&gt;</span>
<span class="w">  </span><span class="nt">&lt;checks&gt;</span>
<span class="w">    </span><span class="cm">&lt;!-- Two pages --&gt;</span>
<span class="w">    </span><span class="nt">&lt;eval</span><span class="w"> </span><span class="na">expected=</span><span class="s">&quot;2&quot;</span><span class="w"> </span><span class="na">xpath=</span><span class="s">&quot;count(//pageViewport)&quot;</span><span class="nt">/&gt;</span>
<span class="w">    </span><span class="cm">&lt;!-- Only one line on the first page --&gt;</span>
<span class="w">    </span><span class="nt">&lt;eval</span><span class="w"> </span><span class="na">expected=</span><span class="s">&quot;1&quot;</span><span class="w"> </span><span class="na">xpath=</span><span class="s">&quot;count(//pageViewport[@nr=1]//flow/block)&quot;</span><span class="nt">/&gt;</span>
<span class="w">    </span><span class="nt">&lt;eval</span><span class="w"> </span><span class="na">expected=</span><span class="s">&quot;First line&quot;</span><span class="w"> </span><span class="na">xpath=</span><span class="s">&quot;//pageViewport[@nr=1]//flow/block[1]/lineArea/text[1]&quot;</span><span class="nt">/&gt;</span>
<span class="w">    </span><span class="cm">&lt;!-- Line &quot;Before the table&quot; plus the table itself on the second page --&gt;</span>
<span class="w">    </span><span class="nt">&lt;eval</span><span class="w"> </span><span class="na">expected=</span><span class="s">&quot;2&quot;</span><span class="w"> </span><span class="na">xpath=</span><span class="s">&quot;count(//pageViewport[@nr=2]//flow/block)&quot;</span><span class="nt">/&gt;</span>
<span class="w">    </span><span class="nt">&lt;eval</span><span class="w"> </span><span class="na">expected=</span><span class="s">&quot;After the table&quot;</span><span class="w"> </span><span class="na">xpath=</span><span class="s">&quot;//pageViewport[@nr=2]//flow/block[2]/lineArea/text[1]&quot;</span><span class="nt">/&gt;</span>
<span class="w">  </span><span class="nt">&lt;/checks&gt;</span>
<span class="nt">&lt;/testcase&gt;</span>
</pre></div>
