Как мне сделать 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));

    });
}
Другие вопросы по тегам