如何通过XSL返回外部PDF文件的(总)页面数量

时间:2016-07-13 10:28:37

标签: xslt xslt-2.0 xsl-fo

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

PDFBox的: https://pdfbox.apache.org/

PDFBox的PDDocument类具有返回目标PDF的页数的方法。因此,您可以按照以下步骤获取页数:

  1. 编写Java类和静态方法。
  2. 从XSLT styleshhet调用它。
  3. [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 stylesheet]

    <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)"/>
    …
    

答案 1 :(得分:1)

没有开箱即用,没有。如何做到这一点包括:

  • 使用可以报告页数的命令行工具,例如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文件都是可读的,那就是未解析的文字&#39;通过XSLT,您可以使用unparsed-text()阅读PDF,然后使用XSLT的正则表达式功能来查找正确的字符串。
  • 您可以使用XSLT中的打印和页面布局社区组(https://www.w3.org/community/ppl/wiki/XSLTExtensions)中的XSLT扩展来从仅包含外部PDF的FO文件中获取区域树,并计算其中的页数这一点。
  • 在运行XSLT之前,您可以从Antenna House运行AHPDFXML(请参阅https://www.antennahouse.com/antenna1/ahpdfxml-conversion-library/)以获取PDF的XML表示,然后您的XSLT可以计算该XML中的页数。