n8n-nodes-pdf-page-extract
Version:
n8n node to extract PDF pages as an array of text
153 lines • 6.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PdfPageExtract = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const pdfParse = require('pdf-parse');
class PdfPageExtract {
constructor() {
this.description = {
displayName: 'PDF Page Extract',
name: 'pdfPageExtract',
icon: 'file:pdf.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"]}}',
description: 'Extraheert tekst per pagina uit een PDF bestand',
defaults: {
name: 'PDF Page Extract',
},
inputs: ["main"],
outputs: ["main"],
properties: [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Extract Pages',
value: 'extractPages',
description: 'Extract text from PDF as an array of pages',
action: 'Extract text from PDF as an array of pages',
},
],
default: 'extractPages',
},
{
displayName: 'Binary Property',
name: 'binaryPropertyName',
type: 'string',
default: 'data',
required: true,
displayOptions: {
show: {
operation: ['extractPages'],
},
},
description: 'Name of the binary property which contains the PDF data',
},
{
displayName: 'Include Raw Text',
name: 'includeRawText',
type: 'boolean',
default: false,
displayOptions: {
show: {
operation: ['extractPages'],
},
},
description: 'Whether to include the complete raw text in addition to the pages array',
},
{
displayName: 'Include Metadata',
name: 'includeMetadata',
type: 'boolean',
default: true,
displayOptions: {
show: {
operation: ['extractPages'],
},
},
description: 'Whether to include PDF metadata in the output',
},
],
};
}
async execute() {
const items = this.getInputData();
const returnData = [];
const operation = this.getNodeParameter('operation', 0);
if (operation === 'extractPages') {
for (let i = 0; i < items.length; i++) {
try {
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i);
const includeRawText = this.getNodeParameter('includeRawText', i);
const includeMetadata = this.getNodeParameter('includeMetadata', i);
if (!items[i].binary) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No binary data exists on item!');
}
const binaryData = items[i].binary;
if (!binaryData[binaryPropertyName]) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Binary data property "${binaryPropertyName}" does not exist on item!`);
}
const buffer = await this.helpers.getBinaryDataBuffer(i, binaryPropertyName);
if (buffer.length === 0) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'PDF binary data is empty after decoding!');
}
const pages = [];
const options = {
pagerender: function (pageData) {
const renderOptions = {
normalizeWhitespace: false,
disableCombineTextItems: false
};
return pageData.getTextContent(renderOptions)
.then(function (textContent) {
let text = '';
for (const item of textContent.items) {
text += item.str + ' ';
}
pages.push(text.trim());
return text;
});
}
};
const data = await pdfParse(buffer, options);
const json = {
filename: binaryData[binaryPropertyName].fileName || 'document.pdf',
totalPages: data.numpages,
pages: pages,
};
if (includeRawText) {
json.text = data.text;
}
if (includeMetadata) {
json.metadata = data.metadata;
json.info = data.info;
}
const newItem = {
json,
binary: items[i].binary,
};
returnData.push(newItem);
}
catch (error) {
if (this.continueOnFail()) {
returnData.push({
json: {
error: error.message,
},
binary: items[i].binary,
});
continue;
}
throw error;
}
}
}
return [returnData];
}
}
exports.PdfPageExtract = PdfPageExtract;
//# sourceMappingURL=PdfPageExtract.node.js.map