diff --git a/packages/placeholder-plain/src/findObject.js b/packages/placeholder-plain/src/findObject.js index b1ff9691..0d564b2b 100644 --- a/packages/placeholder-plain/src/findObject.js +++ b/packages/placeholder-plain/src/findObject.js @@ -1,5 +1,36 @@ import getIndexFromRef from './getIndexFromRef'; +/** + * @typedef {object} FindObjectAtReturnType + * @property {Buffer} dictionary + * @property {Buffer} stream + */ + +/** + * @param {Buffer} pdf + * @param {number} position + * @returns {FindObjectAtReturnType} + */ +export const findObjectAt = (pdf, position) => { + let slice = pdf.subarray(position); + slice = slice.subarray(0, slice.indexOf('endobj', 'utf8') - 1); + // ^ Buffer from the start position until the first endobj (included). + + const dictionary = slice.subarray( + slice.indexOf('<<', 'utf8') + 2, + slice.indexOf('>>', 'utf8') - 1, + ); + const stream = slice.subarray( + slice.indexOf('stream', 'utf8') + 6, + slice.indexOf('endstream', 'utf8') - 1, + ); + + return { + dictionary, + stream, + }; +}; + /** * @param {Buffer} pdf * @param {Map} refTable @@ -9,13 +40,7 @@ const findObject = (pdf, refTable, ref) => { const index = getIndexFromRef(refTable, ref); const offset = refTable.offsets.get(index); - let slice = pdf.slice(offset); - slice = slice.slice(0, slice.indexOf('endobj', 'utf8')); - - // FIXME: What if it is a stream? - slice = slice.slice(slice.indexOf('<<', 'utf8') + 2); - slice = slice.slice(0, slice.lastIndexOf('>>', 'utf8')); - return slice; + return findObjectAt(pdf, offset).stream; }; export default findObject;