Как мне сделать 2 (или более) вызова с помощью Adobe PDF Services и пропустить использование файловой системы (между ними?)
Достаточно просто сделать один вызов Adobe PDF Services, получить результат и сохранить его, например:
// more stuff above
exportPdfOperation.execute(executionContext)
.then(result => result.saveAsFile(output))
Но если я хочу выполнить две или более операций, нужно ли мне сохранять результат в файловой системе и повторно предоставлять его (это хоть слово;) API?
1 ответ
Так что меня это тоже сбило с толку. В большинстве демонстраций вы увидите:
result => result.saveAsFile()
к концу. Однако объект переходит к выполненному обещанию,
result
, является объектом FileRef, который затем можно использовать в качестве входных данных для другого вызова.
Вот пример, который принимает входной документ Word и вызывает метод API для создания PDF-файла. Затем он берет это и запускает OCR. Оба метода, которые обертывают вызовы API, возвращают FileRefs, поэтому в конце я
saveAsFile
в теме. (Обратите внимание, что в этой демонстрации используется версия 1 из SDK, она будет работать так же с версией 2.)
const PDFToolsSdk = require('@adobe/documentservices-pdftools-node-sdk');
const fs = require('fs');
//clean up previous
(async ()=> {
// hamlet.docx was too big for conversion
const input = './hamlet2.docx';
const output = './multi.pdf';
const creds = './pdftools-api-credentials.json';
if(fs.existsSync(output)) fs.unlinkSync(output);
let result = await createPDF(input, creds);
console.log('got a result');
result = await ocrPDF(result, creds);
console.log('got second result');
await result.saveAsFile(output);
})();
async function createPDF(source, creds) {
return new Promise((resolve, reject) => {
const credentials = PDFToolsSdk.Credentials
.serviceAccountCredentialsBuilder()
.fromFile(creds)
.build();
const executionContext = PDFToolsSdk.ExecutionContext.create(credentials),
createPdfOperation = PDFToolsSdk.CreatePDF.Operation.createNew();
// Set operation input from a source file
const input = PDFToolsSdk.FileRef.createFromLocalFile(source);
createPdfOperation.setInput(input);
let stream = new Stream.Writable();
stream.write = function() {
}
stream.end = function() {
console.log('end called');
resolve(stream);
}
// Execute the operation and Save the result to the specified location.
createPdfOperation.execute(executionContext)
.then(result => resolve(result))
.catch(err => {
if(err instanceof PDFToolsSdk.Error.ServiceApiError
|| err instanceof PDFToolsSdk.Error.ServiceUsageError) {
reject(err);
} else {
reject(err);
}
});
});
}
async function ocrPDF(source, creds) {
return new Promise((resolve, reject) => {
const credentials = PDFToolsSdk.Credentials
.serviceAccountCredentialsBuilder()
.fromFile(creds)
.build();
const executionContext = PDFToolsSdk.ExecutionContext.create(credentials),
ocrOperation = PDFToolsSdk.OCR.Operation.createNew();
// Set operation input from a source file.
//const input = PDFToolsSdk.FileRef.createFromStream(source);
ocrOperation.setInput(source);
let stream = new Stream.Writable();
stream.end = function() {
console.log('end called');
resolve(stream);
}
// Execute the operation and Save the result to the specified location.
ocrOperation.execute(executionContext)
.then(result => resolve(result))
.catch(err => reject(err));
});
}