Почему моя программа не возвращает правильную информацию о файле? - PullRequest
2 голосов
/ 04 октября 2019

Что я хочу сделать: Чтение текста из PDF-файлов в определенной папке. В этой папке несколько файлов PDF, и я должен просмотреть их, чтобы получить текст из каждого.

У меня проблема: Моя программа не получает правильную File информацию и возвращает ошибку Invalid Argument. Сообщение об ошибке только это.

Язык: Скрипт Google Apps

Мой код:

//Folder ID
var myFolderID = "XXXXXXXXXXXXXXXXXXXXXXXXX";

/**
Get PDF files from the folder and return them in an array
*/ 
function GetPdfFiles(){
    var pdfFiles = [];
    var files = DriveApp.getFolderById(myFolderID).getFiles();
    while(files.hasNext())
    {
         var file = files.next();
         //retrieve only pdf files (non-pdf files need to be ignored)
         if(file.getName().indexOf("pdf") >= 1)
         {
             //Add to the array the file data
             pdfFiles.push(file);
         }
    }
    return pdfFiles;
}

/**
Do some operations to each PDF file 
*/
function DoSomeOperations(pdfFiles){

    for(var i = 0; i < pdfFiles.length; i++)
    {
        //The below line of code doesn't work
        var doc = DocumentApp.openByUrl(pdfFiles[i].getUrl());   /*Error*/
        //I also tried the below code instead of the above line of code
        var doc = DocumentApp.openById(pdfFiles[i].getId());     /*Error*/


        /*Ideally, do some operation to each PDF file here */
        /*I was hoping to use something like this: */
        var textFromPdfFile = doc.getBody().getText();
        /*But I cannot get this "doc" in the first place.*/
    }
}

function Main(){
    var pdfFiles = GetPdfFiles();
    DoSomeOperations(pdfFiles);
}

Может кто-нибудь сказать мне, что я делаю не так?

Редактировать: Я зарегистрировал "getID" и "getUrl" результат, и он показывает результат. Но похоже, что это не фактический идентификатор или URL ... Я не знаю, что происходит.

1 Ответ

2 голосов
/ 05 октября 2019
  • Вы хотите извлечь текст из файлов PDF, используя doc.getBody().getText().
  • MimeType для файла PDF: application/pdf.
  • Вы хотите добиться этого с помощью Google AppsСценарий.

Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Точки изменения:

  • К сожалению, на данном этапе файл PDF не может быть открыт напрямую с помощью DocumentApp.openByUrl() и DocumentApp.openById(). В этом случае сначала файл PDF необходимо преобразовать в документ Google. Таким образом, его можно открыть с помощью DocumentApp.openByUrl() и DocumentApp.openById().

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

В этом модифицированном скрипте используется метод Files: копия Drive API. ,Поэтому, прежде чем использовать этот сценарий, , пожалуйста, включите Drive API в расширенных службах Google.

//Folder ID
var myFolderID = "XXXXXXXXXXXXXXXXXXXXXXXXX";

/**
Get PDF files from the folder and return them in an array
*/ 
function GetPdfFiles(){
    var pdfFiles = [];
    var files = DriveApp.getFolderById(myFolderID).getFiles();
    while(files.hasNext())
    {
         var file = files.next();
         //retrieve only pdf files (non-pdf files need to be ignored)
         if (file.getMimeType() == MimeType.PDF) { // Check the mimeType.
             // Convert PDF file to Google Document
             var id = Drive.Files.copy({mimeType: MimeType.GOOGLE_DOCS}, file.getId()).id;
             //Add to the array the file data
             pdfFiles.push(id);
         }
    }
    return pdfFiles;
}

/**
Do some operations to each PDF file 
*/
function DoSomeOperations(pdfFiles){

    for(var i = 0; i < pdfFiles.length; i++)
    {
        //The below line of code doesn't work
        // var doc = DocumentApp.openByUrl(pdfFiles[i].getUrl()); // This is not used.
        //I also tried the below code instead of the above line of code
        var doc = DocumentApp.openById(pdfFiles[i]);


        /*Ideally, do some operation to each PDF file here */
        /*I was hoping to use something like this: */
        var textFromPdfFile = doc.getBody().getText();
        /*But I cannot get this "doc" in the first place.*/

        // Drive.Files.remove(pdfFiles[i]); // If you want to delete the converted file, please use this line.
    }
}

function Main(){
    var pdfFiles = GetPdfFiles();
    DoSomeOperations(pdfFiles);
}

Ссылки:

Если я неправильно понял ваш вопрос и это не то направление, в котором вы хотите, я приношу свои извинения.

Редактировать:

  • Вы хотите преобразовать файл PDF в Google Document, если имя файла преобразованного документа Google не существует.

Если мое понимание верно, как насчет этой модификации? Пожалуйста, измените приведенный выше сценарий следующим образом.

Шаблон 1:

Использовали ли вы эту строку Drive.Files.remove(pdfFiles[i]); в моем приведенном выше сценарии? При использовании этой строки преобразованный документ Google всегда удаляется. В этом случае файлы Документов Google с тем же именем файла не создаются. Как насчет этого?

Шаблон 2:

Если вы не хотите использовать Drive.Files.remove(pdfFiles[i]);, как насчет следующей модификации? Пожалуйста, измените функцию GetPdfFiles() следующим образом. Благодаря этой модификации, когда существует то же имя файла документа Google, файл PDF не преобразуется.

С:
// Convert PDF file to Google Document
var id = Drive.Files.copy({mimeType: MimeType.GOOGLE_DOCS}, file.getId()).id;
//Add to the array the file data
pdfFiles.push(id);
До:
var existingFile = DriveApp.getFilesByName(file.getName().split(".")[0]);
if (!(existingFile.hasNext() && existingFile.next().getMimeType() == MimeType.GOOGLE_DOCS)) {
  // Convert PDF file to Google Document
  var id = Drive.Files.copy({mimeType: MimeType.GOOGLE_DOCS}, file.getId()).id;
  //Add to the array the file data
  pdfFiles.push(id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...