英文:
Function to Combine 2 PDFs getting timeout error
问题
这是我的用于将两个PDF合并成一个的函数(这是在一个较大的forEach循环中进行的,但我没有包括它,因为我不想让问题变得太复杂)。
我已经注意到了所有的控制台日志输出,它们似乎表明PDF文件是有效的,并且成功加载了。然而,函数的最终结果是创建一个名为"combined.pdf"的新文件,但这并没有发生。在运行我的函数后,我收到了以下错误消息:"ReferenceError: setTimeout is not defined"
// ****** FUNCTION 1 ******
async function loadPDF(pdfBytes) {
try {
const loadedPdf = await PDFLib.PDFDocument.load(pdfBytes);
console.log(`PDF loaded successfully`);
return loadedPdf;
} catch (error) {
console.log(`Error loading PDF:`, error);
return null;
}
}
// ****** MAIN FUNCTION ******
async function combinePDFsIntoOne () {
const cdnjs = 'https://cdn.jsdelivr.net/npm/pdf-lib@1.16.0/dist/pdf-lib.min.js';
eval(UrlFetchApp.fetch(cdnjs).getContentText());
const pdfFile1 = pdf;
const pdfFile2 = pdfP2FileName;
console.log(typeof pdfFile1) //object
console.log(pdfFile1)
/*
{ toString: [Function],
getName: [Function],
getBytes: [Function],
setName: [Function],
getContentType: [Function],
setContentType: [Function],
setBytes: [Function],
getDataAsString: [Function],
setDataFromString: [Function],
isGoogleType: [Function],
getAllBlobs: [Function],
setContentTypeFromExtension: [Function],
copyBlob: [Function],
getAs: [Function] }
*/
console.log(typeof pdfFile2) //object
console.log(pdfFile2)
/*
{ toString: [Function],
getName: [Function],
getBytes: [Function],
setName: [Function],
getContentType: [Function],
setContentType: [Function],
setBytes: [Function],
getDataAsString: [Function],
setDataFromString: [Function],
isGoogleType: [Function],
getAllBlobs: [Function],
setContentTypeFromExtension: [Function],
copyBlob: [Function],
getAs: [Function] }
*/
// 以“二进制字符串”的形式读取文件
const pdfBytes1 = new Uint8Array(pdfFile1.getBytes());
const pdfBytes2 = new Uint8Array(pdfFile2.getBytes());
// 创建新的PDF文档
const pdfDoc = await PDFLib.PDFDocument.create();
// // 加载第一个和第二个PDF文档
// const firstPDF = await PDFLib.PDFDocument.load(pdfBytes1);
// const secondPDF = await PDFLib.PDFDocument.load(pdfBytes2);
// 尝试加载第一个PDF
const firstPDF = await loadPDF(pdfBytes1); // PDF加载成功
console.log(typeof firstPDF);
if (!firstPDF) {
console.log(`Error loading first PDF ${typeof firstPDF}`);
}
// 尝试加载第二个PDF
const secondPDF = await loadPDF(pdfBytes2); // PDF加载成功
if (!secondPDF) {
console.log(`Error loading second PDF ${typeof secondPDF}`);
}
// 获取要导入的页面
const firstPDFPages = await pdfDoc.copyPages(firstPDF, firstPDF.getPageIndices());
const secondPDFPages = await pdfDoc.copyPages(secondPDF, secondPDF.getPageIndices());
// 向PDF中添加页面
firstPDFPages.forEach((page) => pdfDoc.addPage(page));
secondPDFPages.forEach((page) => pdfDoc.addPage(page));
const pdfBytes = await pdfDoc.save();
const newBlob = Utilities.newBlob(Array.from(pdfBytes), 'application/pdf');
newBlob.setName('combined.pdf');
holdingFolder.createFile(newBlob);
};
try {
await combinePDFsIntoOne ();
}
catch(err) {
console.log(`Error is: ${err}`) // Error is: ReferenceError: setTimeout is not defined
}
英文:
Here is my function that I'm using to combine two PDFs into one (this is happening within a larger forEach loop but I didn't include it because I don't want to overcomplicate my question).
I have noted all the console log outputs, which seem to indicate the PDF files are valid and they load successfully. However, the end result of the function is to create a new file called "combined.pdf" and this is not happening. I am getting this error after I run my function: "ReferenceError: setTimeout is not defined"
// ****** FUNCTION 1 ******
async function loadPDF(pdfBytes) {
try {
const loadedPdf = await PDFLib.PDFDocument.load(pdfBytes);
console.log(`PDF loaded successfully`);
return loadedPdf;
} catch (error) {
console.log(`Error loading PDF:`, error);
return null;
}
}
// ****** MAIN FUNCTION ******
async function combinePDFsIntoOne () {
const cdnjs = 'https://cdn.jsdelivr.net/npm/pdf-lib@1.16.0/dist/pdf-lib.min.js';
eval(UrlFetchApp.fetch(cdnjs).getContentText());
const pdfFile1 = pdf;
const pdfFile2 = pdfP2FileName;
console.log(typeof pdfFile1) //object
console.log(pdfFile1)
/*
{ toString: [Function],
getName: [Function],
getBytes: [Function],
setName: [Function],
getContentType: [Function],
setContentType: [Function],
setBytes: [Function],
getDataAsString: [Function],
setDataFromString: [Function],
isGoogleType: [Function],
getAllBlobs: [Function],
setContentTypeFromExtension: [Function],
copyBlob: [Function],
getAs: [Function] }
*/
console.log(typeof pdfFile2) //object
console.log(pdfFile2)
/*
{ toString: [Function],
getName: [Function],
getBytes: [Function],
setName: [Function],
getContentType: [Function],
setContentType: [Function],
setBytes: [Function],
getDataAsString: [Function],
setDataFromString: [Function],
isGoogleType: [Function],
getAllBlobs: [Function],
setContentTypeFromExtension: [Function],
copyBlob: [Function],
getAs: [Function] }
*/
// Read files as "Binary Strings"
const pdfBytes1 = new Uint8Array(pdfFile1.getBytes());
const pdfBytes2 = new Uint8Array(pdfFile2.getBytes());
// Create new pdf
const pdfDoc = await PDFLib.PDFDocument.create();
// // Load the first and second PDFs
// const firstPDF = await PDFLib.PDFDocument.load(pdfBytes1);
// const secondPDF = await PDFLib.PDFDocument.load(pdfBytes2);
// Try loading the first PDF
const firstPDF = await loadPDF(pdfBytes1); // PDF loaded successfully
console.log(typeof firstPDF);
if (!firstPDF) {
console.log(`Error loading first PDF ${typeof firstPDF}`);
}
// Try loading the second PDF
const secondPDF = await loadPDF(pdfBytes2); // PDF loaded successfully
if (!secondPDF) {
console.log(`Error loading second PDF ${typeof secondPDF}`);
}
// Get pages to import
const firstPDFPages = await pdfDoc.copyPages(firstPDF, firstPDF.getPageIndices());
const secondPDFPages = await pdfDoc.copyPages(secondPDF, secondPDF.getPageIndices());
// Add pages to the PDF
firstPDFPages.forEach((page) => pdfDoc.addPage(page));
secondPDFPages.forEach((page) => pdfDoc.addPage(page));
const pdfBytes = await pdfDoc.save();
const newBlob = Utilities.newBlob(Array.from(pdfBytes), 'application/pdf');
newBlob.setName('combined.pdf');
holdingFolder.createFile(newBlob);
};
try {
await combinePDFsIntoOne ();
}
catch(err) {
console.log(`Error is: ${err}`) // Error is: ReferenceError: setTimeout is not defined
}
答案1
得分: 1
哇,我找到了bug!我只需要定义这个变量就可以了:
const setTimeout = function (f, t) {
Utilities.sleep(t);
return f();
}
再次感谢Tanaike,他对Google Apps Script真是一个很好的资源!
英文:
Wow, I found the bug! All I had to do was define this variable:
const setTimeout = function (f, t) {
Utilities.sleep(t);
return f();
}
Thanks again to Tanaike for being such a great resource for Google Apps Script!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论