-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtextractUtils.js
112 lines (92 loc) · 2.59 KB
/
textractUtils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const _ = require("lodash");
const aws = require("aws-sdk");
const config = require("./config");
aws.config.update({
accessKeyId: config.awsAccesskeyID,
secretAccessKey: config.awsSecretAccessKey,
region: config.awsRegion
});
const textract = new aws.Textract();
const getText = (result, blocksMap) => {
let text = "";
if (_.has(result, "Relationships")) {
result.Relationships.forEach(relationship => {
if (relationship.Type === "CHILD") {
relationship.Ids.forEach(childId => {
const word = blocksMap[childId];
if (word.BlockType === "WORD") {
text += `${word.Text} `;
}
if (word.BlockType === "SELECTION_ELEMENT") {
if (word.SelectionStatus === "SELECTED") {
text += `X `;
}
}
});
}
});
}
return text.trim();
};
const findValueBlock = (keyBlock, valueMap) => {
let valueBlock;
keyBlock.Relationships.forEach(relationship => {
if (relationship.Type === "VALUE") {
// eslint-disable-next-line array-callback-return
relationship.Ids.every(valueId => {
if (_.has(valueMap, valueId)) {
valueBlock = valueMap[valueId];
return false;
}
});
}
});
return valueBlock;
};
const getKeyValueRelationship = (keyMap, valueMap, blockMap) => {
const keyValues = {};
const keyMapValues = _.values(keyMap);
keyMapValues.forEach(keyMapValue => {
const valueBlock = findValueBlock(keyMapValue, valueMap);
const key = getText(keyMapValue, blockMap);
const value = getText(valueBlock, blockMap);
keyValues[key] = value;
});
return keyValues;
};
const getKeyValueMap = blocks => {
const keyMap = {};
const valueMap = {};
const blockMap = {};
let blockId;
blocks.forEach(block => {
blockId = block.Id;
blockMap[blockId] = block;
if (block.BlockType === "KEY_VALUE_SET") {
if (_.includes(block.EntityTypes, "KEY")) {
keyMap[blockId] = block;
} else {
valueMap[blockId] = block;
}
}
});
return { keyMap, valueMap, blockMap };
};
module.exports = async buffer => {
const params = {
Document: {
/* required */
Bytes: buffer
},
FeatureTypes: ["FORMS"]
};
const request = textract.analyzeDocument(params);
const data = await request.promise();
if (data && data.Blocks) {
const { keyMap, valueMap, blockMap } = getKeyValueMap(data.Blocks);
const keyValues = getKeyValueRelationship(keyMap, valueMap, blockMap);
return keyValues;
}
// in case no blocks are found return undefined
return undefined;
};