#c# #xml #xslt #apache-fop
Вопрос:
Поэтому я использую таблицу стилей (для тестирования), как показано ниже, с помощью Fonet.Стандарт v1.0.5 через NuGet. Он генерирует PDF-файл, и когда содержимое <fo:flow flow-name=»xsl-регион-тело»> подходит для менее чем страницы, все в порядке. Но когда содержимое переполняет его, в PDF создается только первая страница, однако нижний колонтитул правильно указывает, что должно быть несколько страниц, т. Е. в нем указана страница 1 из 2. Та же структура отлично работает с Apache FOP в среде, отличной от Windows. Так что я должен делать это по-другому с Фонетом.Стандартный? Для справки xml для тестирования был удален обратно в
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<DateTime>02/06/2021 10:56</DateTime>
</Data>
и xslt-это
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
<fo:layout-master-set>
<fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="18mm" margin-bottom="18mm" margin-left="18mm" margin-right="18mm">
<fo:region-body margin-top="80mm" margin-bottom="5mm"/>
<fo:region-before region-name="header-first" extent="80mm" />
<fo:region-after region-name="footer-first" extent="20mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="rest" page-height="29.7cm" page-width="21cm" margin-top="18mm" margin-bottom="18mm" margin-left="18mm" margin-right="18mm">
<fo:region-body margin-top="25mm" margin-bottom="5mm"/>
<fo:region-before region-name="header-rest" extent="25mm" />
<fo:region-after region-name="footer-rest" extent="5mm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="document">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference page-position="first" master-reference="first"/>
<fo:conditional-page-master-reference page-position="rest" master-reference="rest"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="document">
<fo:static-content flow-name="footer-first">
<fo:block padding="1pt" text-align="center">
page <fo:page-number/> of <fo:page-number-citation ref-id="LastPageIndicator"/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="footer-rest">
<fo:block padding="1pt" text-align="center">
page <fo:page-number/> of <fo:page-number-citation ref-id="LastPageIndicator"/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="header-first">
<fo:block padding="1pt" text-align="center">
test first header
</fo:block>
</fo:static-content>
<fo:static-content flow-name="header-rest">
<fo:block padding="1pt" text-align="center">
test rest header
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block padding="1pt" text-align="center">
test detai here
</fo:block>
<fo:block id="LastPageIndicator"> </fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Комментарии:
1. Проверьте поля, высоту и размеры в xsd. Они не выглядят последовательными. Я не знаю размеров страниц, которые вы используете для вывода PDF, поэтому не могу рекомендовать изменения.
2. опечатка в «первом»
3. Высота страницы составляет 29,7 см, что кажется небольшим. Верхний колонтитул составляет 80 мм (0,8 см), а нижний колонтитул-20 мм (0,2 см).
4. да, 29,7 см-это высота формата А4, 80 мм=8 см. 20 мм=2 см… все правильно
5. Ваш xslt выглядит просто отлично. Помогает ли добавление атрибута region-name в fo:region-body следующим образом <поле fo:region-body-вверху=»80 мм», поле внизу=»5 мм», имя региона=»xsl-регион-тело»/> ?
Ответ №1:
извините, не обращайте внимания на шум! Код фонета работает нормально. в .Рендеринге использовался поток памяти, который позже преобразуется в Pdf, и там был код, начиная с того момента, когда ожидалось, что это будет только одна страница. В конечном итоге найдено при отладке с помощью .Render, выводящего данные непосредственно в файл вместо потока.