如何获取用户上传的.PDF的页数?
Posted
技术标签:
【中文标题】如何获取用户上传的.PDF的页数?【英文标题】:How to get the number of pages of a .PDF uploaded by user? 【发布时间】:2012-05-02 11:28:40 【问题描述】:我有一个文件输入,在“上传”之前,我需要在 javascript 中计算该 .pdf 的页数(例如 JQuery...)
【问题讨论】:
看看github.com/mozilla/pdf.js 此外,如果您担心页面数量过多,您可以限制可以上传到您网站的文件的大小。 【参考方案1】:如果您使用 pdf.js,您可以使用以下代码引用 example on github ('.../examples/node/getinfo.js') 来打印 pdf 文件中的页数。
const pdfjsLib = require('pdfjs-dist');
...
pdfjsLib.getDocument(pdfPath).then(function (doc)
var numPages = doc.numPages;
console.log('# Document Loaded');
console.log('Number of Pages: ' + numPages);
)
【讨论】:
最后一个字符缺少一个结尾)
。【参考方案2】:
还有一个纯 JavaScript 解决方案:
var input = document.getElementById("files");
var reader = new FileReader();
reader.readAsBinaryString(input.files[0]);
reader.onloadend = function()
var count = reader.result.match(/\/Type[\s]*\/Page[^s]/g).length;
console.log('Number of Pages:',count );
【讨论】:
该正则表达式适用于满足许多假设的文档,特别是对于具有多次修订或大量使用对象流的文档可能会失败。 我在许多 pdf 文档上对其进行了测试,并且可以正常工作。有样品吗? 我可以创建任意数量的样本:您肯定知道,字节级别的 PDF 格式允许添加 cmets;因此,我可以简单地将包含“/Type /Page”的任意数量的 cmets 添加到现有文档中,从而使正则表达式返回过高的结果。但是您可能不是指构建的示例,而是现实世界的示例。为此,您可能需要查看this one 等问题。 我收到此消息 - 类型“字符串”上不存在属性“匹配”|数组缓冲区'。类型“ArrayBuffer”.ts(2339) 上不存在属性“匹配”【参考方案3】:正如其他答案中所述,您正在寻找类似 pdf.js 的内容。我查看了 API,它确实包含一个 numPages() 函数来返回总页数。查看demo page from Mozilla.时,它似乎也为我计算页数
这取决于您是否能够将现代浏览器和实验性技术用于您的解决方案。 pdf.js 非常令人印象深刻,但根据github page 仍然是实验性的。
如果你能统计上传后服务器上的页面,那么你应该看看pdftools或类似的。
pdftools --countpages
之类的东西就是你要找的东西
【讨论】:
【参考方案4】:我认为自从 Tracker1 发布答案后,API 发生了一些变化。我尝试了 Tracker1 的代码,看到了这个错误:
Uncaught TypeError: pdfjsLib.getDocument(...).then is not a function
一个小改动解决了它:
const pdfjsLib = require('pdfjs-dist');
...
pdfjsLib.getDocument(pdfPath).promise.then(function (doc)
var numPages = doc.numPages;
console.log('# Document Loaded');
console.log('Number of Pages: ' + numPages);
【讨论】:
【参考方案5】:在使用 Pdf-lib 的 typescript 类中,我使用以下内容。
// getPAGE COUNT:
async getPageCount(formUrl: any): Promise<number>
const LogPdfFields = [] as any[];
const formPdfBytes = await fetch(formUrl).then((res) => res.arrayBuffer());
const pdfDoc = await PDFDocument.load(formPdfBytes);
const pageCount = pdfDoc.getPageCount();
return pageCount;
作为承诺调用
【讨论】:
【参考方案6】:您也可以使用pdf-lib
。
您需要从输入字段中读取文件,然后使用pdf-lib
来获取页数。代码是这样的:
import PDFDocument from 'pdf-lib';
...
const readFile = (file) =>
return new Promise((resolve, reject) =>
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
reader.readAsArrayBuffer(file);
);
const getNumPages =async (file) =>
const arrayBuffer = await readFile(file);
const pdf = await PDFDocument.load(arrayBuffer);
return pdf.getPages();
然后只需获取附件的页数:
const numPages = await getNumPages(input.files[0]);
作为 input
存储对文件输入的 DOM 元素的引用的变量。
【讨论】:
以上是关于如何获取用户上传的.PDF的页数?的主要内容,如果未能解决你的问题,请参考以下文章