Apache FOP 2.2 -> 2.3, нумерация страниц - PullRequest
0 голосов
/ 03 февраля 2019

Я столкнулся с проблемой при переносе / обновлении FOP с версии 2.2 до 2.3.Пагинатор перестал работать ... Вот пример кода:

Основной "шаблон":

<xsl:stylesheet 
version="1.1" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format"
exclude-result-prefixes="fo">
<fo:page-sequence 
    master-reference="templates/A4.xsl" 
    initial-page-number="1" 
    font-size="9pt" 
    font-weight="plain"
    font-family="Arial"
>

    <section id="footer" filename="templates/ftr_PgNmb.xsl" />

    <fo:flow flow-name="xsl-region-body">

        <fo:block >Page 1</fo:block>

        <fo:block page-break-before="always"/>
        <fo:block >Page 2</fo:block>

        <fo:block page-break-before="always"/>
        <fo:block>Page 3</fo:block>

        <fo:block id="last-page" />

    </fo:flow>

</fo:page-sequence>

Пагинатор 1:

<xsl:stylesheet version="1.1" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format"
exclude-result-prefixes="fo"
>
<xsl:apply-templates select="templates/ftr_PgNmbTemplate.xsl"/>

Paginator 2:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
exclude-result-prefixes="fo">
<xsl:template match="templates/ftr_PgNmbTemplate.xsl">  
<fo:static-content flow-name="xsl-region-after-firstpage">
    <fo:block>
        <fo:table table-layout="fixed" width="100%" border-collapse="separate">
            <fo:table-column />
            <fo:table-body>
                <fo:table-row>
                    <fo:table-cell>
                        <fo:block text-align="right">
                            Page <fo:page-number /> of <fo:page-number-citation-last ref-id="last-page"/>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </fo:block>
</fo:static-content>

<fo:static-content flow-name="xsl-region-after-otherpages">
    <fo:block>
        <fo:table table-layout="fixed" width="100%" border-collapse="separate">
            <fo:table-column/>
            <fo:table-body>
                <fo:table-row>
                    <fo:table-cell>
                        <fo:block text-align="right">
                            Page <fo:page-number /> of <fo:page-number-citation-last ref-id="last-page"/>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </fo:block>
</fo:static-content>

</xsl:template>

Ошибка, которую я получаю:

SEVERE: Ошибка при сериализации страницы 1. Причина: java.io.NotSerializableException: org.apache.fop.fo.pagination.PageSequence java.io.NotSerializableException: org.apache.fop.fo.pagination.PageSequence в java.io.ObjectOutputStream.writeObject0 (Неизвестный источник)

1022

Есть намеки?Я понятия не имею, вообще.Все, что я обнаружил, - это проблема с <fo:page-number-citation-last ref-id="last-page"/> call.Если это удалено, PDF создается просто отлично.С этим ... Нет.

РЕДАКТИРОВАТЬ: Полный XSL для поколения:

java.io.NotSerializableException: org.apache.fop.fo.pagination.PageSequence

1 Ответ

0 голосов
/ 04 февраля 2019

Согласно странице справки FOP о FO :

... Для этого в XSL 1.0 поместите пустой блок с идентификатором вконец потока:

<fo:flow ...>
  ...
  <!-- block, NOT page-sequence -->
  <fo:block id="last-page"/>
</fo:flow>

Получить номер последней страницы следующим образом:

<!-- page-number-citation, NOT page-number-citation-last !!! -->
<fo:page-number-citation ref-id="last-page"/>

Этот не работает в определенных ситуациях: несколько последовательностей страниц, начальный номер страницы, отличный от 1, или принудительное задание определенного количества страниц, что приводит к созданию пустых страниц в конце.

В XSL 1.1 вы получаете другойвозможность сделать это: убедиться, что на последовательности страниц установлен идентификатор "id" и сослаться на него с помощью fo: page-number-citation -last .Сначала последовательность страниц:

<!-- page-sequence, NOT block-->
<fo:page-sequence id="seq1" ...

После этого ссылайтесь на последнюю страницу, сгенерированную последовательностью страниц:

<!-- page-number-citation-last, NOT page-number-citation !! -->
<fo:page-number-citation-last ref-id="seq1"/>

Предупреждение : Не существует надежного способа получить реальное общее количество страниц с помощью механизмов FO.Вы можете получить только номера страниц.


Так что в вашем случае, пожалуйста:

  1. Измените <fo:page-number-citation-last/> на <fo:page-number-citation/>.
  2. Или, альтернативно, введите атрибут id="lastPage" в вашем (последнем) page-sequence, а не в вашем последнем block, тогда вы можете обратиться к нему через:

    <fo:page-number-citation-last ref-id="last-page"/>`
    
...