如何在Apache FOP中为目录内每张图片动态生成page-sequence
动态生成每页一张图片的FO页面序列
要实现根据目录中图片数量动态创建<fo:page-sequence>,核心是用XSLT遍历图片列表,为每张图片生成独立的页面序列。以下是两种常见实现方式:
方式1:基于XML数据源遍历
如果你有一个记录所有图片路径的XML文件(比如images.xml),可以用XSLT的<xsl:for-each>循环生成页面:
示例XML数据源(images.xml)
<images> <image path="Images/newpage0.jpg"/> <image path="Images/newpage1.jpg"/> </images>
对应的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/"> <fo:root> <!-- 定义A4页面模板 --> <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="1cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <!-- 遍历每个图片节点,生成独立页面 --> <xsl:for-each select="images/image"> <fo:page-sequence master-reference="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block> <fo:external-graphic src="url({@path})" width="100%" scaling="uniform" content-width="scale-to-fit" /> </fo:block> </fo:flow> </fo:page-sequence> </xsl:for-each> </fo:root> </xsl:template> </xsl:stylesheet>
方式2:直接读取目录(XSLT 2.0+)
如果没有XML数据源,可使用XSLT 2.0及以上版本的collection()函数直接读取目标目录下的图片文件,无需手动维护图片列表:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/"> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="1cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <!-- 读取Images目录下所有jpg文件,按文件名排序 --> <xsl:for-each select="collection('file:///your/absolute/path/Images/?select=*.jpg;recurse=no')"> <xsl:sort select="tokenize(document-uri(.), '/')[last()]" order="ascending"/> <fo:page-sequence master-reference="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block> <fo:external-graphic src="url({document-uri(.)})" width="100%" scaling="uniform" content-width="scale-to-fit" /> </fo:block> </fo:flow> </fo:page-sequence> </xsl:for-each> </fo:root> </xsl:template> </xsl:stylesheet>
注意事项
- 若使用
collection(),需确保XSLT处理器支持2.0+版本(如Saxon)。 - 目录路径需使用正确的URI格式:Windows系统示例为
file:///C:/Projects/Images/?select=*.jpg,Linux/macOS为file:///home/user/Images/?select=*.jpg。 <xsl:sort>用于保证图片按文件名顺序生成页面,可根据需求调整排序规则。
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

