Как получить количество страниц .PDF, загруженных пользователем?

У меня есть вход для файла, и перед "загрузкой" мне нужно рассчитать количество страниц этого .pdf в JAVASCRIPT (например, JQuery...)

Ответ 1

Возможно, вы сможете что-то сделать, используя pdf.js, но это потребует некоторых экспериментов.

Ответ 2

Если вы используете pdf.js, вы можете сослаться на пример на 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);
}

Ответ 3

и чистое решение для 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 );
}

Ответ 4

Как было сказано в других ответах, что-то вроде pdf.js - это то, что вы ищете. Я взглянул на API и включил функцию numPages(), чтобы вернуть общее количество страниц. Он также, кажется, считает страницы для меня при просмотре демонстрационной страницы из Mozilla.

Это зависит от того, сможете ли вы использовать современные браузеры и экспериментальные технологии для вашего решения. pdf.js очень впечатляет, но он по-прежнему экспериментален по странице github.

Если вы можете рассчитывать страницы на сервере после загрузки, вы должны посмотреть pdftools или аналогичный.

Что-то вроде pdftools --countpages - это то, что вы ищете

Ответ 5

Вы также можете использовать 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 async getNumPages = (file) => {

  const arrayBuffer = await readFile(file);

  const pdf = await PDFDocument.load(arrayBuffer);

  return pdf.getPages();
}

А затем просто получите количество страниц вложенного файла с помощью:

const numPages = await getNumPages(input.files[0]);

являясь input переменной, в которой хранится ссылка на элемент DOM входного файла.