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

如何将AFP/PDF的总页数输出到.txt文件(XSL FO环境)

解决方案:将Apache FOP生成文档的总页数输出到TXT文件

核心问题在于:fo:page-number-citation-last是FOP格式化阶段计算的结果,而xsl:result-document属于XSLT转换阶段,两个阶段完全独立,无法直接在XSLT中获取格式化后的总页数。以下是几种可行的实现方式:

方式一:通过FOP Java API直接获取页数并写入TXT

如果你的项目基于Java开发,这是最直接的方案。在FOP完成文档渲染后,通过FOUserAgent的结果对象获取总页数,再写入TXT文件:

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStream;

public class FopPageCountExample {
    public static void main(String[] args) throws Exception {
        // 初始化FOP工厂
        FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        // 定义输出文件(以PDF为例,AFP同理)
        File outputFile = new File("output.pdf");
        OutputStream out = new FileOutputStream(outputFile);

        try {
            // 创建FOP实例,指定输出格式
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

            // 执行XSLT转换并渲染文档
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer(new StreamSource("input.xsl"));
            StreamSource xmlSource = new StreamSource("input.xml");
            SAXResult saxResult = new SAXResult(fop.getDefaultHandler());
            transformer.transform(xmlSource, saxResult);

            // 获取总页数
            int totalPages = foUserAgent.getResults().getPageCount();

            // 写入TXT文件
            FileWriter txtWriter = new FileWriter(outputFile.getName().replace(".pdf", ".txt"));
            txtWriter.write(String.valueOf(totalPages));
            txtWriter.close();

        } finally {
            out.close();
        }
    }
}

方式二:命令行场景下的后处理方案

如果使用FOP命令行工具生成文档,可以通过第三方工具解析生成的文件获取页数,再写入TXT:

针对PDF文件(使用Apache PDFBox)

# 第一步:用FOP生成PDF
fop -xml input.xml -xsl input.xsl -pdf output.pdf

# 第二步:用PDFBox提取页数并写入TXT
java -jar pdfbox-app-2.0.32.jar PDFInfo output.pdf | grep "Pages:" | awk '{print $2}' > output.txt

针对AFP文件

可以使用专门的AFP解析库(如Apache AFPBox)的命令行工具,类似PDFBox的方式提取页数后写入TXT。

方式三:基于数据源预计算页数(仅适用于特定场景)

如果你的XML数据源中存在可以推导总页数的规则(比如固定每页显示N条数据,已知总数据条数),可以直接在XSLT中计算页数,通过xsl:result-document输出:

<xsl:result-document href="{$FileName}.txt" method="text">
  <xsl:value-of select="ceiling(count(/data/items) div 10)"/> <!-- 假设每页显示10条 -->
</xsl:result-document>

这种方式仅适用于页数可提前计算的场景,无法处理动态分页(如内容自动换行跨页)的情况。

内容的提问来源于stack exchange,提问作者Pooja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:10