如何将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
相关产品推荐
相关产品推荐

