如何通过 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 页数的方法。因此,您可以通过以下步骤获取页数:
- 写Javaclass和静态方法
- 从 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)"/>
…
是否可以通过 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 页数的方法。因此,您可以通过以下步骤获取页数:
- 写Javaclass和静态方法
- 从 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)"/>
…