heavysixer / node-pptx

Generate PPTX files on the server-side with JavaScript.
MIT License
159 stars 44 forks source link

Would you accept a PR to allow loading pptx from buffer OR file path? #119

Open MP70 opened 1 year ago

MP70 commented 1 year ago

Issue with loading PowerPoint file from buffer

The save() method allows you to specify either a callback (passing buffer) or file path, but when loading a PowerPoint file, you must pass a file path. This can be pretty inconvenient in cases where you already have the PowerPoint file contents in a buffer.

Proposed solution

To address this issue, can we please add support for loading from a buffer as well as a file path.

I've quickly scanned your code, and at first glance it looks like it's as simple as changing loadExistingPPTX() : https://github.com/heavysixer/node-pptx/blob/7e137b5743b2ea46f9f8c7ef3d48ecc4a6d7ff05/lib/presentation.js#L99-L103 To something like:

async loadExistingPPTX(done) {
    // Throw an error if templateFilePath is null or undefined
    if (!this.templateFilePath) {
        throw new Error('Input is null or undefined. Input must be a file path or buffer.');
    }

    try {
        // Check if templateFilePath is a string (file path)
        if (typeof this.templateFilePath === 'string') {
            // Load PowerPoint file from the specified file path using fs.readFileSync()
            await this.powerPointFactory.loadFromRawFileData(fs.readFileSync(this.templateFilePath));
        }
        // Check if templateFilePath is a buffer
        else if (Buffer.isBuffer(this.templateFilePath)) {
            // Load PowerPoint file from the buffer directly using powerPointFactory.loadFromRawFileData()
            await this.powerPointFactory.loadFromRawFileData(this.templateFilePath);
        }
        // If templateFilePath is neither a string nor a buffer, throw an error
        else {
            throw new Error('Invalid input type. Input must be a file path or buffer.');
        }
    } catch (error) {
        // Catch any errors that occur during loading and rethrow with a more descriptive message
        throw new Error(`Error loading PPTX file: ${error.message}`);
    }
}

Obviously we'd also need to change the variable name to templateFile or similar and any other housekeeping as needed.

Would you accept a PR from me along these lines to add this feature?

BrandonvanB commented 1 year ago

Has there been any follow up regarding this? I seem to be in a similar position.

MP70 commented 1 year ago

This project seems pretty dead IMO. I ended up not using it. Feel free to use my code above as a starting point if you'd like, consider it MIT licensed.