【问题标题】:Count total number of pages in pdf file计算pdf文件中的总页数
【发布时间】:2019-01-03 09:20:36
【问题描述】:

每周,我都会从客户那里收到一组 pdf 文件。

他们会将 pdf 文件粘贴到特定的 google 驱动器文件夹中。我需要 pdf 文件的总页数。我试图在 Apps 脚本中创建一个代码,这将有助于更新 pdf 文件名和特定 Google 工作表中的总页数。

我找到了为 google 文档 herehere 创建的代码。

但这不起作用。我正在寻找一个可以帮助检查特定驱动器文件夹并更新 pdf 文件名和特定 google 工作表中的总页数的 Apps 脚本。

我尝试过下面的脚本。

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 文件....

提前致谢。

【问题讨论】:

  • PDF 是 blob 内容,这意味着您需要解释目标文件的字节。页数是 PDF 布局的函数 - 不是 Google 所做或拥有的函数。
  • @ashokkumar ponnnusamy 很抱歉我帮不了你。

标签: pdf google-apps-script


【解决方案1】:

不幸的是,目前还没有使用 Google API 从 PDF 文件中直接检索总页数的方法。那么这些变通方法呢?请根据您的情况进行选择。

解决方法 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)
  }
}
  • 虽然这种解决方法很简单,但它可能无法像@mkl 所说的那样用于所有 PDF 文件。如果此解决方法不能用于您的 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 method。这是一个示例脚本。因此,请根据您的情况进行修改。

注意:

  • 我可以在我的应用程序中使用这些解决方法。但我无法确认所有 PDF 文件。因此,如果这些解决方法不适用于您的 PDF 文件,我很抱歉。

参考:

【讨论】:

  • pdf 中的页面数量可能多于或少于 /Contents 的出现次数。由于操作员不控制客户的上传(至少他没有另外指出),他不知道他的客户上传的 pdf 是否与您的类似。因此,在他的情况下,您的方法可能会返回不准确的结果。
  • @mkl 谢谢你的建议。是的。所以我添加了一个注释部分,并为我也在使用的 Google Apps 脚本提出了一个简单的解决方法。但是根据您的建议,我又添加了一种解决方法。它使用 API。通过这种方式,OP 可以为 OP 的情况选择解决方法。你怎么看这个?
  • 可能第二种解决方法更准确,但您依赖外部 api 并且必须考虑 api 不可用的情况。哦,好吧...
  • @mkl 感谢您的回复。我为我糟糕的技能道歉。我想学习更多。
  • 无需为任何事情道歉。外部 api 只是具有可能并非一直可用的缺点。因此,使用它们意味着自己的代码也只有有限的可用性。这不一定是 KO,但必须意识到这一点并告诉自己的客户。
【解决方案2】:
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();
};

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多