You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:14:53