使用 Google Apps 脚本在 ConvertAPI 中合并 PDF
Merge PDF in ConvertAPI using Google Apps Script
我正在尝试使用以下代码通过 ConvertAPI 合并来自 Google Drive 的两个 PDF 文件。 pdf1和pdf2都是文件对象
function mergePDFs(pdf1,pdf2){
const formData = ""
formData['Files[0]'] = pdf1.getBlob();
formData['Files[1]'] = pdf2.getBlob();
Logger.log(formData['Files[0]']);
Logger.log(formData);
endpoint = "https://v2.convertapi.com/convert/pdf/to/merge?Secret=XXXXXXXXXXXXX&StoreFile=true"
var options = {
'method' : 'post',
'payload' : formData,
'muteHttpExceptions': true
};
Logger.log(UrlFetchApp.fetch(endpoint,options));
}
我收到以下错误代码:
{"Code":4000,"Message":"Parameter validation error.","InvalidParameters":{"Files":["Files array item count must be greater than 0."]}}
应该注意 Logger.log() 语句都是空的。在我看来,pdf1 和 pdf2 到 formData['Files[index]'] 的分配不是
由于我不熟悉此语法,因此我对以下行进行了相当大的修改,但在 .
上引用了它
formData['Files[0]'] = pdf1.getBlob();
formData['Files[1]'] = pdf2.getBlob();
我还发现 formData 的声明是无关紧要的,无论它是声明为数组还是字符串。
最后,来自 ConvertAPI 的 pertinent documentation 说:
Files to be converted. Value can be URL or file content. If used in >query or multipart content parameter must be suffixed with index >e.g. Files[0], Files1, Files[2]...
主函数中的以下几行与所讨论的函数相关:
//lodgingRecieptId is set to a url
const receiptFile = DriveApp.getFileById(lodgingReceiptId);
...
const copyID = frontPage.makeCopy().getId();
const copyDoc = DocumentApp.openById(copyID)
copyDoc.setName("MPD | " + sheet.getLastRow());
const body = copyDoc.getBody();
//find and replace in template copy
body.replaceText("{{AMOUNT}}",amount)
body.replaceText("{{CURRENT_DATE}}",current_date)
body.replaceText("{{LOCATION}}",location)
body.replaceText("{{PURPOSE}}",purpose);
body.replaceText("{{DEPART_DATE}}",formatLeaveDate);
body.replaceText("{{RETURN_DATE}}",formatReturnDate);
body.replaceText("{RSB} ",rsb);
body.replaceText("{{DAYS}}",days);
body.replaceText("{{MPD_AMOUNT}}",mpdAmount);
const docBlob = copyDoc.getAs('application/pdf');
docBlob.setName(copyDoc.getName() + ".pdf");
const copyPdf = DriveApp.createFile(docBlob);
//merge lodging receipt and template copy ——> Save id
mergePDFs(copyPdf,receiptFile)
根据你的展示脚本和your showing official document,下面的修改怎么样?
修改后的脚本:
请用您的密码替换 <YOUR SECRET HERE>
。
function mergePDFs(pdf1, pdf2) {
var fileValues = [pdf1.getBlob(), pdf2.getBlob()].map((e, i) => ({
"Name": e.getName() || `sample${i + 1}`,
"Data": Utilities.base64Encode(e.getBytes())
}));
var data = { "Parameters": [{ "Name": "Files", "FileValues": fileValues }, { "Name": "StoreFile", "Value": true }] };
var endpoint = "https://v2.convertapi.com/convert/pdf/to/merge?Secret=<YOUR SECRET HERE>";
var options = {
'method': 'post',
'payload': JSON.stringify(data),
'contentType': "application/json",
'muteHttpExceptions': true
};
var res = UrlFetchApp.fetch(endpoint, options);
var outputPDFURL = JSON.parse(res.getContentText()).Files[0].Url;
var outputFile = UrlFetchApp.fetch(outputPDFURL).getBlob().setName("sampleOutput.pdf");
DriveApp.createFile(outputFile);
}
注:
- 在这个修改中,它假设你的秘密是有效的使用这个API和
pdf1
和pdf2
是PDF数据的文件对象或HTTPResponse对象。请注意这一点。
参考文献:
我正在尝试使用以下代码通过 ConvertAPI 合并来自 Google Drive 的两个 PDF 文件。 pdf1和pdf2都是文件对象
function mergePDFs(pdf1,pdf2){
const formData = ""
formData['Files[0]'] = pdf1.getBlob();
formData['Files[1]'] = pdf2.getBlob();
Logger.log(formData['Files[0]']);
Logger.log(formData);
endpoint = "https://v2.convertapi.com/convert/pdf/to/merge?Secret=XXXXXXXXXXXXX&StoreFile=true"
var options = {
'method' : 'post',
'payload' : formData,
'muteHttpExceptions': true
};
Logger.log(UrlFetchApp.fetch(endpoint,options));
}
我收到以下错误代码:
{"Code":4000,"Message":"Parameter validation error.","InvalidParameters":{"Files":["Files array item count must be greater than 0."]}}
应该注意 Logger.log() 语句都是空的。在我看来,pdf1 和 pdf2 到 formData['Files[index]'] 的分配不是
由于我不熟悉此语法,因此我对以下行进行了相当大的修改,但在
formData['Files[0]'] = pdf1.getBlob();
formData['Files[1]'] = pdf2.getBlob();
我还发现 formData 的声明是无关紧要的,无论它是声明为数组还是字符串。
最后,来自 ConvertAPI 的 pertinent documentation 说:
Files to be converted. Value can be URL or file content. If used in >query or multipart content parameter must be suffixed with index >e.g. Files[0], Files1, Files[2]...
主函数中的以下几行与所讨论的函数相关:
//lodgingRecieptId is set to a url
const receiptFile = DriveApp.getFileById(lodgingReceiptId);
...
const copyID = frontPage.makeCopy().getId();
const copyDoc = DocumentApp.openById(copyID)
copyDoc.setName("MPD | " + sheet.getLastRow());
const body = copyDoc.getBody();
//find and replace in template copy
body.replaceText("{{AMOUNT}}",amount)
body.replaceText("{{CURRENT_DATE}}",current_date)
body.replaceText("{{LOCATION}}",location)
body.replaceText("{{PURPOSE}}",purpose);
body.replaceText("{{DEPART_DATE}}",formatLeaveDate);
body.replaceText("{{RETURN_DATE}}",formatReturnDate);
body.replaceText("{RSB} ",rsb);
body.replaceText("{{DAYS}}",days);
body.replaceText("{{MPD_AMOUNT}}",mpdAmount);
const docBlob = copyDoc.getAs('application/pdf');
docBlob.setName(copyDoc.getName() + ".pdf");
const copyPdf = DriveApp.createFile(docBlob);
//merge lodging receipt and template copy ——> Save id
mergePDFs(copyPdf,receiptFile)
根据你的展示脚本和your showing official document,下面的修改怎么样?
修改后的脚本:
请用您的密码替换 <YOUR SECRET HERE>
。
function mergePDFs(pdf1, pdf2) {
var fileValues = [pdf1.getBlob(), pdf2.getBlob()].map((e, i) => ({
"Name": e.getName() || `sample${i + 1}`,
"Data": Utilities.base64Encode(e.getBytes())
}));
var data = { "Parameters": [{ "Name": "Files", "FileValues": fileValues }, { "Name": "StoreFile", "Value": true }] };
var endpoint = "https://v2.convertapi.com/convert/pdf/to/merge?Secret=<YOUR SECRET HERE>";
var options = {
'method': 'post',
'payload': JSON.stringify(data),
'contentType': "application/json",
'muteHttpExceptions': true
};
var res = UrlFetchApp.fetch(endpoint, options);
var outputPDFURL = JSON.parse(res.getContentText()).Files[0].Url;
var outputFile = UrlFetchApp.fetch(outputPDFURL).getBlob().setName("sampleOutput.pdf");
DriveApp.createFile(outputFile);
}
注:
- 在这个修改中,它假设你的秘密是有效的使用这个API和
pdf1
和pdf2
是PDF数据的文件对象或HTTPResponse对象。请注意这一点。