在我的项目中,XSL-FO用于动态创建PDF。从网格/表中选择文档,我无法预测它的编号。所有文档都作为一个PDF打印。我需要为每个子文件添加一个页码,即
我的主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 - ....
答案 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:marker
(http://www.w3.org/TR/xsl/#fo_marker)并使用fo:flow
(http://www.w3.org/TR/xsl/#fo_retrieve-marker )t:DeliveryDocumentModel
。您应该能够在http://www.antennahouse.com/antenna1/comprehensive-xsl-fo-tutorials-and-samples-collection/