diff --git a/README.md b/README.md index 69ff928..764ff96 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Extract text content from a file. - XLS - XLSX - JSON +- PPTX ### How to use @@ -28,7 +29,7 @@ npm i -D any-text var reader = require('any-text'); reader - .getText(`path-to-file`) + .getText({ filePath: `path-to-file` }) .then(function (data) { console.log(data); // handle success }) @@ -42,11 +43,23 @@ reader ```js var reader = require('any-text'); -const text = await reader.getText(`path-to-file`); +const text = await reader.getText({ filePath: `path-to-file` }); console.log(text); ``` +- The `getText` method now also supports buffer input +```js +var reader = require('any-text'); + +const buffer = fs.readFileSync(`path-to-file`); +const text = await reader.getText({ fileData: buffer, fileExtension: '.pdf' }); + +console.log(text); + +``` + + ### Sample Test ```js @@ -57,11 +70,18 @@ const expect = chai.expect; describe('file reader checks', () => { it('check docx file content', async () => { - expect(await reader.getText(`${process.cwd()}/test/files/dummy.docx`)).to.contains( + expect(await reader.getText({ filePath: `${process.cwd()}/test/files/dummy.docx` })).to.contains( 'Lorem ipsum' ); }); + + it('check pptx file content', async () => { + expect(await reader.getText({ filePath: `${process.cwd()}/test/files/sample.pptx` })).to.contains( + 'Sample text' + ); + }); }); + ``` ### Tell me your issues diff --git a/index.js b/index.js index 7454ffa..bdeeb71 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,11 @@ const fs = require('fs'); const StreamZip = require('node-stream-zip'); const XLSX = require('xlsx'); -const pdf = require('pdf-parse'); +const pdf = require('pdf-parse/lib/pdf-parse'); +const JSZip = require('jszip'); let WordExtractor = require('word-extractor'); +const { DOMParser } = require('xmldom'); + // extract text from office books as doc and docx extract = (filePath) => { @@ -50,6 +53,51 @@ open = (filePath) => { }); }; +getTextFromPPTX = async (buffer) => { + try { + const zip = new JSZip(); + await zip.loadAsync(buffer); + + const aNamespace = + "http://schemas.openxmlformats.org/drawingml/2006/main"; + let text = []; + + let slideIndex = 1; + while (true) { + const slideFile = zip.file(`ppt/slides/slide${slideIndex}.xml`); + + if (!slideFile) break; + + const slideXmlStr = await slideFile.async("text"); + + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString( + slideXmlStr, + "application/xml" + ); + + text.push(getTextFromNodes(xmlDoc, "t", aNamespace)); + slideIndex++; + } + + return text; + } catch (err) { + console.error("Error extracting text from PPTX:", err); + return ""; + } +} + +function getTextFromNodes(node, tagName, namespaceURI) { + let text = ""; + const textNodes = node.getElementsByTagNameNS(namespaceURI, tagName); + for (let i = 0; i < textNodes.length; i++) { + text += textNodes[i].textContent + " "; + } + return text.trim(); +} + + + // get the file extension based on the file path getFileExtension = (filename) => { if (filename.length == 0) return ''; @@ -60,12 +108,25 @@ getFileExtension = (filename) => { }; // read the file and extract text -exports.getText = async (filePath) => { +exports.getText = async ({ filePath, fileData, fileExtension }) => { let fileContent = ''; - let data = fs.readFileSync(filePath); - const fileExtension = getFileExtension(filePath); + if (filePath) { + // Legge il file dal percorso specificato + fileData = fs.readFileSync(filePath); + fileExtension = getFileExtension(filePath); + } else if (!fileData || !fileExtension) { + throw new Error('you have to provide either file path or file data and extension!'); + } + if(!fileExtension){ + fileExtension = getFileExtension(filePath); + } + if(!fileData){ + var data = fs.readFileSync(filePath); + }else{ + var data = fileData; + } switch (fileExtension) { // read pdf case '.pdf': @@ -76,7 +137,7 @@ exports.getText = async (filePath) => { case '.docx': case '.doc': var extractor = new WordExtractor(); - var extracted = await extractor.extract(filePath); + var extracted = await extractor.extract(data); fileContent = extracted.getBody(); break; @@ -103,7 +164,9 @@ exports.getText = async (filePath) => { case '.json': fileContent = data.toString(); break; - + case '.pptx': + fileContent = await getTextFromPPTX(data); + break; // default case default: throw new Error('unknown extension found!'); diff --git a/package.json b/package.json index 7e238d8..38658e3 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,12 @@ "author": "Abhinaba Ghosh ", "license": "MIT", "dependencies": { + "jszip": "^3.10.1", "node-stream-zip": "^1.11.2", "pdf-parse": "^1.1.1", "word-extractor": "^1.0.4", - "xlsx": "^0.18.0" + "xlsx": "^0.18.0", + "xmldom": "^0.6.0" }, "devDependencies": { "chai": "^4.2.0", diff --git a/test/files/dummy.pptx b/test/files/dummy.pptx new file mode 100644 index 0000000..ea72794 Binary files /dev/null and b/test/files/dummy.pptx differ diff --git a/test/spces/fileReader.spec.js b/test/spces/fileReader.spec.js index 3c0d106..d66b170 100644 --- a/test/spces/fileReader.spec.js +++ b/test/spces/fileReader.spec.js @@ -1,53 +1,178 @@ let fileReader = require('../..'); - +const fs = require('fs'); const chai = require('chai'); const expect = chai.expect; chai.use(require('chai-as-promised')); describe('file reader checks', () => { it('check xls file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.xls`)).to.contains( + const filePath = `${process.cwd()}/test/files/dummy.xls`; + expect(await fileReader.getText({filePath: filePath})).to.contains( 'Kathleen' ); }); it('check xlsx file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.xlsx`)).to.contains( + const filePath = `${process.cwd()}/test/files/dummy.xlsx`; + expect(await fileReader.getText({filePath: filePath})).to.contains( 'Kathleen' ); }); it('check pdf file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.pdf`)).to.contains('Dummy'); + const filePath = `${process.cwd()}/test/files/dummy.pdf`; + expect(await fileReader.getText({filePath: filePath})).to.contains('Dummy'); }); it('check docx file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.docx`)).to.contains( + const filePath = `${process.cwd()}/test/files/dummy.docx`; + expect(await fileReader.getText({filePath: filePath})).to.contains( 'Lorem ipsum' ); }); it('check doc file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.doc`)).to.contains( + const filePath = `${process.cwd()}/test/files/dummy.doc`; + expect(await fileReader.getText({filePath: filePath})).to.contains( 'Welcome' ); }); it('check csv file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.csv`)).to.contains( + const filePath = `${process.cwd()}/test/files/dummy.csv`; + expect(await fileReader.getText({filePath: filePath})).to.contains( 'First Name' ); }); it('check json file content', async () => { - expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.json`)).to.contains('Doe'); + const filePath = `${process.cwd()}/test/files/dummy.json`; + expect(await fileReader.getText({filePath: filePath})).to.contains('Doe'); + }); + + it('check pptx file content', async () => { + const filePath = `${process.cwd()}/test/files/dummy.pptx`; + expect((await fileReader.getText({filePath})).toString()).to.contains( + 'Sample' + ); }); it('Throw error on unknown extension', async () => { try { - await fileReader.getText(`${process.cwd()}/test/files/dummy.html`); + const filePath = `${process.cwd()}/test/files/dummy.html`; + await fileReader.getText({filePath: filePath}); } catch (err) { expect(String(err)).to.contains('Error: unknown extension found!'); } }); + + it('xls whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.xls`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.xls'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'Kathleen' + ); + }); + + it('xlsx whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.xlsx`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.xlsx'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'Kathleen' + ); + }); + + it('pdf whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.pdf`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.pdf'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'Dummy' + ); + }); + + it('docx whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.docx`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.docx'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'Lorem ipsum' + ); + }); + + it('doc whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.doc`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.doc'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'Welcome' + ); + }); + + it('csv whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.csv`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.csv'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'First Name' + ); + }); + + it('json whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.json`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.json'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect(await fileReader.getText({ fileData, fileExtension })).to.contains( + 'Doe' + ); + }); + + it('pptx whit buffer reader', async () => { + const filePath = `${process.cwd()}/test/files/dummy.pptx`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.pptx'; + const result = await fileReader.getText({ fileData, fileExtension }); + + expect((await fileReader.getText({ fileData, fileExtension })).toString()).to.contains( + 'Sample' + ); + }); + it('Throw error on unknown extension with buffer reader', async () => { + try { + const filePath = `${process.cwd()}/test/files/dummy.html`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.html'; + await fileReader.getText({ fileData, fileExtension }); + } catch (err) { + expect(String(err)).to.contains('Error: unknown extension found!'); + } + }); + + it('Throw error on unknown extension with buffer reader', async () => { + try { + const filePath = `${process.cwd()}/test/files/dummy.html`; + const fileData = fs.readFileSync(filePath); + const fileExtension = '.html'; + await fileReader.getText({ fileData, fileExtension }); + } catch (err) { + expect(String(err)).to.contains('Error: unknown extension found!'); + } + }); + });