如何获取用户上传的.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的页数?的主要内容,如果未能解决你的问题,请参考以下文章

Netsuite PDF模板:获取页数作为属性

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?

如何在 PDF 中显示页数?

急需一个可以批量获取每个word文档的页数的小工具

请问有大神知道C#怎么获取上传的文档的缩略图吗?

如何获取jasperReport报表总页数