如何通过 XSL return 外部 PDF 文件的(总)页数

How to return the (total) pagecount of external PDF files via XSL

是否可以通过 XSL return 外部 PDF 文件的总页数? AntennaHouse Formatter 是否有等效的扩展?

提前致谢!

不是开箱即用的,不是。方法包括:

  • 使用可以报告页数的命令行工具,例如pdftk (https://www.pdflabs.com/tools/pdftk-server/)。在 运行使用 XSLT 创建 FO 之前,您可以 运行 PDF 上的工具并将结果保存到文件中,然后在 XSLT 处理过程中读取该文件。
  • 不太可靠,您可以在 PDF 上使用 grep 等,并将其输出保存到要读取的文件中。参见,例如,http://www.unix.com/printthread.php?t=55661&pp=40
  • 如果您认为所有 PDF 都可以通过 XSLT 读取为 'unparsed text',那么您可以使用 unparsed-text() 读取 PDF,然后使用 XSLT 的正则表达式功能找到正确的字符串。
  • 您可以在您的 XSLT 中使用来自打印和页面布局社区组 (https://www.w3.org/community/ppl/wiki/XSLTExtensions) 的 XSLT 扩展,从仅包含您的外部 PDF 的 FO 文件中获取区域树并计算其中的页数。
  • 在 运行使用 XSLT 之前,您可以 运行 AHPDFXML 来自 Antenna House(参见 https://www.antennahouse.com/antenna1/ahpdfxml-conversion-library/)以获得您的 XML 表示PDF,那么您的 XSLT 可以计算其中的页数 XML。

如果您使用的是基于 Java 的允许外部函数调用的 XSLT 处理器(例如 Saxon PE 或 EE),那么 Apache PDFBox 会帮助您。

PDF 框: https://pdfbox.apache.org/

PDFBox 的 PDDocument class 具有 returns 目标 PDF 页数的方法。因此,您可以通过以下步骤获取页数:

  1. 写Javaclass和静态方法
  2. 从 XSLT 样式调用它。

[Java示例代码]

package com.acme.pdfutil;
import java.io.File;
import org.apache.pdfbox.pdmodel.PDDocument;
public class pdfDocument {
    /**
     * Get the page count of specified PDF file.
     * @param filePath 
     * @return Page count
     */
    public static int getPageCount(String filePath){
        File pdfFile = null;
        PDDocument pdfDoc = null;
        int pageCount = -1;
        try {
            pdfFile = new File(filePath);
            pdfDoc = PDDocument.load(pdfFile);
            pageCount = pdfDoc.getNumberOfPages();
        }
        catch (Exception e) {
            System.out.println("[getPageCount] " + e.getMessage());
        }
        finally {
            if (pdfDoc != null){
                try{
                    pdfDoc.close();
                }
                catch (Exception e) {
                    ;
                }
            }
        }
        return pageCount;
    }
}

[XSLT 样式表]

<xsl:stylesheet version="2.0" 
 xmlns:fo="http://www.w3.org/1999/XSL/Format" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:acmejava="java:com.acme.pdfutil.pdfDocument"
>
…
<!-- Call external function -->
<xsl:variable name=”pdfPageCount” as="xs:integer" select="acmejava:getPageCount($pdfPath)"/>
…