上传前要校验页数、批量打印前要估纸张、按页拆分前要先知道文档规模——这类场景要的都只是一个数字:文档有几页。在浏览器里拿到这个数字并不顺手:渲染库只管把页面画出来,页数得自己数;绕开这一层,就只能把文件送到服务端去解析。
本文介绍用 Spire.PDF for JavaScript 获取 PDF 文档的页数。它基于 WebAssembly 在浏览器端直接加载与解析 PDF 文档,全过程在本地完成,通过虚拟文件系统(VFS)读写文件,无需后端配合。本文将向您详细介绍如何统计文档的总页数。
有关安装和项目配置,请参考 React 项目中集成 Spire.PDF for JavaScript。以下示例默认已安装 Spire.PDF 并完成 WebAssembly 模块初始化。
获取 PDF 文档页数
载入文档之后,doc.Pages 就是文档的页面集合,Count 给出集合里的页面数量,也就是文档的总页数——不必逐页遍历累加。
function App() {
const getPageCount = async () => {
// 获取 Spire.PDF WASM 模块
const pdfModule = window.wasmModule?.spirepdf;
// 检查模块是否就绪
if (!pdfModule) {
alert('Spire.PDF is not ready yet');
return;
}
// 将待统计的 PDF 文件载入 VFS
const inputFileName = '多页文档.pdf';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}/data/`);
// 创建 PdfDocument 对象并加载 PDF 文档
const doc = new pdfModule.PdfDocument();
doc.LoadFromFile(inputFileName);
// Pages 是文档的页面集合,Count 即总页数
const pageCount = doc.Pages.Count;
// 统计结果写入 VFS
const outputFileName = '页数统计结果.txt';
const report = `文档:${inputFileName}\r\n总页数:${pageCount} 页`;
window.dotnetRuntime.Module.FS.writeFile(outputFileName, report);
doc.Close();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>获取 PDF 文档页数</h1>
<button onClick={getPageCount}>
开始统计
</button>
</div>
);
}
export default App;
统计结果输出为文本文件,记录文档的总页数:

常见问题
阅读器里显示的页码和取到的总页数对不上
原因:Pages.Count 数的是物理页数,即文档里实际有多少个页面。阅读器上那个数字来自页码标签(/PageLabels),可以另行设置:封面不计入编号、目录用罗马数字、正文再从 1 重新开始,都是常见做法。这样一来,第 5 个物理页在阅读器里可能显示成 iii 或 1。
解决:要拿的是显示编号,就读页面自身的 PageLabel,而不是 Count:
// 第 5 个物理页在阅读器里显示成什么编号
const page = doc.Pages.get_Item(4);
console.log(page.PageLabel);
文档没有设置页码标签时,PageLabel 返回空字符串——这时显示编号与物理页序一致,直接用 Count 即可。
载入加密 PDF 取页数时抛 "Can not open an encrypted document. The password is invalid."
原因:文档设了打开密码,LoadFromFile 不提供密码时连内容都读不到,页数自然也无从取得。这一层校验发生在加载阶段,读 Pages.Count 之前就已经抛出。
解决:把打开密码作为 LoadFromFile 的第二个参数传入,之后再读页数:
// 第二个参数即打开密码
doc.LoadFromFile(inputFileName, 'spire123');
const pageCount = doc.Pages.Count;
拿 Count 当循环上界,最后一页报索引越界
原因:Pages 的索引从 0 开始,合法范围是 0 到 Count - 1。循环写成 i <= doc.Pages.Count 时,最后一轮会去取第 Count 个页面,get_Item 抛出越界异常——底层是 .NET 的 ArgumentOutOfRangeException,经 WASM 运行时包装成一个 JS Error,消息为 ArgumentOutOfRange_IndexMustBeLess Arg_ParamName_Name, index。异常名是笼统的 Error,认这条消息即可。
解决:循环条件用 <:
// 上界是 Count - 1,条件用 < 而不是 <=
for (let i = 0; i < doc.Pages.Count; i++) {
const page = doc.Pages.get_Item(i);
}
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









