Подсчитать общее количество страниц в файле PDF - PullRequest
0 голосов
/ 03 января 2019

Каждую неделю я буду получать набор файлов pdf от моих клиентов.

Они вставят PDF-файлы в определенную папку на диске Google. Мне нужно общее количество страниц файла PDF. Я пытался создать код в скрипте Apps, который поможет обновить имя файла pdf и общее количество страниц в определенном листе Google.

Я нашел код, который был создан для Google Docs здесь и здесь .

Но это не работает. Я ищу скрипт Apps, который помогает проверить конкретную папку на диске и обновить имя файла pdf и общее количество страниц в определенном листе Google.

Я попытался описать сценарий ниже.

function getNumberofPages() {
  var myFolder = DriveApp.getFoldersByName("Test").next();
  var files = myFolder.searchFiles('title contains ".PDF"');
  while (files.hasNext()) {
    var file = files.next();
    Logger.log(file.getName());
    Logger.log(file.length);
  }
}

Но опция длины не работает в PDF-файле ....

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 января 2019
function menuItem() {
var folder = 
DriveApp.getFoldersByName('Test').next();
var contents = folder.searchFiles('title contains ".PDF"');
var file;
var name;
var sheet = SpreadsheetApp.getActiveSheet();
var count;

sheet.clear();
sheet.appendRow(["Name", "Number of pages"]);

while(contents.hasNext()) {
file = contents.next();
name = file.getName();
count = 
file.getBlob().getDataAsString().split("/Contents").length - 1;

data = [name, count]
sheet.appendRow(data);
}
};


function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('PDF Page Calculator')
          .addItem("PDF Page Calculator", 
'menuItem')
.addToUi();
};
0 голосов
/ 04 января 2019

К сожалению, пока нет способов прямого извлечения общего количества страниц из файла PDF с помощью API Google. Так как насчет этих обходных путей? Пожалуйста, выберите его для вашей ситуации.

Обходной путь 1:

В этом обходном пути он получает количество потоков содержимого в файле PDF. Потоки контента отображаются как атрибут /Contents.

Когда это отражено в вашем сценарии, оно становится следующим:

Модифицированный скрипт:

function getNumberofPages() {
  var myFolder = DriveApp.getFoldersByName("Test").next();
  var files = myFolder.searchFiles('title contains ".PDF"');
  while (files.hasNext()) {
    var file = files.next();
    var n = file.getBlob().getDataAsString().split("/Contents").length - 1;
    Logger.log("fileName: %s, totalPages: %s", file.getName(), n)
  }
}
  • Хотя этот обходной путь прост, его можно использовать не для всех файлов PDF, как говорит @ mkl . Если этот обходной путь не может быть использован для ваших файлов PDF, как насчет следующего обходного пути 2?

Обходной путь 2:

В этом обходном пути API используется для получения общего количества страниц файла PDF. Я использовал Split PDF API . Общее количество страниц получается из числа разбитых файлов. При использовании этого API проверьте ConvertAPI и получите свой секретный ключ.

Модифицированный скрипт:

function getNumberofPages() {
  var myFolder = DriveApp.getFoldersByName("Test").next();
  var files = myFolder.searchFiles('title contains ".PDF"');
  while (files.hasNext()) {
    var file = files.next();
    var url = "https://v2.convertapi.com/convert/pdf/to/split?Secret=#####"; // Please set your secret key.
    var options = {
      method: "post",
      payload: {File: DriveApp.getFileById(file.getId()).getBlob()},
    }
    var res = UrlFetchApp.fetch(url, options);
    res = JSON.parse(res.getContentText());
    Logger.log("fileName: %s, totalPages: %s", file.getName(), res.Files.length)
  }
}
  • Я не уверен насчет количества файлов PDF и размера файла. Поэтому я не использовал fetchAll метод для этого. Это пример сценария. Поэтому, пожалуйста, измените это для вашей ситуации.

Примечание:

  • Я могу использовать эти обходные пути в своих приложениях. Но я не смог подтвердить для всех файлов PDF. Поэтому, если эти обходные пути не сработали для ваших файлов PDF, извините.

Справка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...