XSL-FO文档中的页码

时间:2015-09-16 06:44:06

标签: xml pdf xslt xsl-fo

在我的项目中,XSL-FO用于动态创建PDF。从网格/表中选择文档,我无法预测它的编号。所有文档都作为一个PDF打印。我需要为每个子文件添加一个页码,即

  • 第1个子文档:1 / 2,2 / 2
  • 第二子文档:1 / 3,2 / 3,3 / 3
  • 第3个子文档:1/1
  • ....

我的主PDF文档的代码,它以一个序列生成页码。

<xsl:import href="DocumentsUtils.DocumentsTemplates.DetailedProductionOrderTemplate.xsd"/>
<xsl:template match="/t:ArrayOfDeliveryDocumentModel">

<fo:page-sequence master-reference="simple" force-page-count="no-force">
    <fo:static-content flow-name="xsl-region-after" font-family="{$font}" font-size="9pt">
      <fo:block text-align="center">
        Page <fo:page-number/>
      </fo:block>
    </fo:static-content>
    <fo:flow page-sequence="xsl-region-body" font-family="{$font}" font-size="9pt">
      <xsl:apply-templates/>
        <fo:block id="last-page"/>
    </fo:flow>
  </fo:page-sequence>

子文档模板

<xsl:template match="t:DeliveryDocumentModel">
<fo:block text-align="center" font-family="{$font}" break-before="page">
  <fo:table border-collapse="collapse" table-layout="fixed">
    <fo:table-column column-width="9.5cm" column-number="1"/>
    <fo:table-column column-width="9.5cm" column-number="2"/>
    <fo:table-body>
      <fo:table-row height="1cm" display-align="center">
        <fo:table-cell text-align="right" border-style="none" padding="0.5pt">
          <fo:block text-align="right" margin-right="1cm" font-weight="bold" font-size="11pt">
            <xsl:value-of select="t:DocumentNoHeader" /> : <xsl:value-of select="t:DocumentNo" />
          </fo:block>
        </fo:table-cell>
        <fo:table-cell text-align="left" border-style="none" padding="0.5pt">
          <fo:block text-align="left">
            <xsl:value-of select="t:DeliveryDateHeader" /> : <xsl:value-of select="extensions:FormatDateTime(t:DeliveryDate)" />
          </fo:block>
        </fo:table-cell>
      </fo:table-row>
    </fo:table-body>
.....

如果它是不可能的,你能帮我在标题中显示模板的值,即每个子文档的订单ID吗?   - 第1个子文档:订单ID:1234   - 第二个子文档:订单ID:1235   - 第3个子文档:订单ID:1236   - ....

2 个答案:

答案 0 :(得分:1)

我没有做过测试,因为你没有发布任何XML,我只是编写了代码。您应该将页面序列生成移动到t:DeliveryDocumentModel模板中,如下所示(带注释)以了解每个部分正在执行的操作:

protected ConnectionFactory connectionFactory;
protected MessageConverter messageConverter;

@Autowired
public void setConnectionFactory (ConnectionFactory connectionFactory) {
    this.connectionFactory = connectionFactory;
}

@Autowired
public void setMessageConverter(@Qualifier("jsonMessageConverter") MessageConverter messageConverter) {
    this.messageConverter = messageConverter;
}

public AmqpInboundChannelAdapter createInboundChannelAdapter(TaskExecutor taskExecutor
        , MessageChannel outputChannel, Queue[] queues, int concurrentConsumers
        , org.aopalliance.aop.Advice[] adviceChain,
        ErrorHandler errorHandler) {
    SimpleMessageListenerContainer listenerContainer =
            new SimpleMessageListenerContainer(connectionFactory);
    //AUTO is default, but setting it anyhow.
    listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
    listenerContainer.setAutoStartup(true);
    listenerContainer.setConcurrentConsumers(concurrentConsumers);
    listenerContainer.setMessageConverter(messageConverter);
    listenerContainer.setQueues(queues);
    //listenerContainer.setChannelTransacted(false);
    listenerContainer.setErrorHandler(errorHandler);
    listenerContainer.setPrefetchCount(1);
    listenerContainer.setTaskExecutor(taskExecutor);
    listenerContainer.setDefaultRequeueRejected(true);
    if (adviceChain != null && adviceChain.length > 0) {
        listenerContainer.setAdviceChain(adviceChain);
    }



    AmqpInboundChannelAdapter a = new AmqpInboundChannelAdapter(listenerContainer);
    a.setMessageConverter(messageConverter);
    a.setAutoStartup(true);
    a.setHeaderMapper(MyAmqpHeaderMapper.createPassAllHeaders());
    a.setOutputChannel(outputChannel);
    return a;
}

基本上,您在每个流上放置一个唯一的id,每个流都在每个文档的页面序列中。您现在通过page-number-citation-last获得流程的最后一页编号。你也会重置每个页面序列,从#34; 1&#34;开始。你应该得到1 ... 3 ... 1 ...的2 ... 1 16 ...哦,你可以删除break-before =&#34; page&#34;在那个块上,因为页面序列正在为你做这件事。

答案 1 :(得分:0)

对于您的页码,请为每个fo:page-sequence单独t:DeliveryDocumentModel并使用initial-page-number="1"重新启动每个页面序列的页码。见http://www.w3.org/TR/xsl/#initial-page-number

您可以使用fo:page-number-citation-last获取fo:page-sequence生成的网页中最后一页的页码。

通过为每个fo:page-sequence单独t:DeliveryDocumentModel,您还可以将订单号放在fo:static-content的{​​{1}}中。

或者,您可以在每个fo:page-sequence的{​​{1}} FO中添加fo:markerhttp://www.w3.org/TR/xsl/#fo_marker)并使用fo:flowhttp://www.w3.org/TR/xsl/#fo_retrieve-markert:DeliveryDocumentModel。您应该能够在http://www.antennahouse.com/antenna1/comprehensive-xsl-fo-tutorials-and-samples-collection/

的“拇指索引(标记,检索标记)”示例中推断出您需要的内容