diff --git a/packages/placeholder-plain/dist/getPageRef.d.ts b/packages/placeholder-plain/dist/getPageRef.d.ts index d466efdb..72002f6b 100644 --- a/packages/placeholder-plain/dist/getPageRef.d.ts +++ b/packages/placeholder-plain/dist/getPageRef.d.ts @@ -3,6 +3,7 @@ * * @param {Buffer} pdfBuffer * @param {Object} info As extracted from readRef() + * @param {Number} [pageNumber = 0] Desired page number */ -export default function getPageRef(pdfBuffer: Buffer, info: any): string; +export default function getPageRef(pdfBuffer: Buffer, info: any, pageNumber?: number): any; //# sourceMappingURL=getPageRef.d.ts.map \ No newline at end of file diff --git a/packages/placeholder-plain/dist/getPageRef.d.ts.map b/packages/placeholder-plain/dist/getPageRef.d.ts.map index 20489a0d..7e92bc0c 100644 --- a/packages/placeholder-plain/dist/getPageRef.d.ts.map +++ b/packages/placeholder-plain/dist/getPageRef.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"getPageRef.d.ts","sourceRoot":"","sources":["../src/getPageRef.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,8CAHW,MAAM,qBAYhB"} \ No newline at end of file +{"version":3,"file":"getPageRef.d.ts","sourceRoot":"","sources":["../src/getPageRef.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,8CAJW,MAAM,uCAiBhB"} \ No newline at end of file diff --git a/packages/placeholder-plain/dist/getPageRef.js b/packages/placeholder-plain/dist/getPageRef.js index 3402e976..c60c44da 100644 --- a/packages/placeholder-plain/dist/getPageRef.js +++ b/packages/placeholder-plain/dist/getPageRef.js @@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getPageRef; +var _utils = require("@signpdf/utils"); var _getPagesDictionaryRef = _interopRequireDefault(require("./getPagesDictionaryRef")); var _findObject = _interopRequireDefault(require("./findObject")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -12,14 +13,19 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * * @param {Buffer} pdfBuffer * @param {Object} info As extracted from readRef() + * @param {Number} [pageNumber = 0] Desired page number */ -function getPageRef(pdfBuffer, info) { +function getPageRef(pdfBuffer, info, pageNumber = 0) { const pagesRef = (0, _getPagesDictionaryRef.default)(info); const pagesDictionary = (0, _findObject.default)(pdfBuffer, info.xref, pagesRef); const kidsPosition = pagesDictionary.indexOf('/Kids'); const kidsStart = pagesDictionary.indexOf('[', kidsPosition) + 1; const kidsEnd = pagesDictionary.indexOf(']', kidsPosition); const pages = pagesDictionary.slice(kidsStart, kidsEnd).toString(); - const split = pages.trim().split(' ', 3); - return `${split[0]} ${split[1]} ${split[2]}`; + const pagesSplit = []; + pages.trim().split(' ').forEach((v, i) => i % 3 === 0 ? pagesSplit.push([v]) : pagesSplit[pagesSplit.length - 1].push(v)); + if (pageNumber < 0 || pagesSplit.length <= pageNumber) { + throw new _utils.SignPdfError(`Failed to get reference of page "${pageNumber}".`, _utils.SignPdfError.TYPE_INPUT); + } + return pagesSplit[pageNumber].join(' '); } \ No newline at end of file diff --git a/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts b/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts index f18f592e..39284a7f 100644 --- a/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts +++ b/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts @@ -1,4 +1,4 @@ -export function plainAddPlaceholder({ pdfBuffer, reason, contactInfo, name, location, signingTime, signatureLength, subFilter, widgetRect, appName, }: InputType): Buffer; +export function plainAddPlaceholder({ pdfBuffer, reason, contactInfo, name, location, signingTime, signatureLength, subFilter, widgetRect, widgetPage, appName, }: InputType): Buffer; export type InputType = { pdfBuffer: Buffer; reason: string; @@ -15,6 +15,10 @@ export type InputType = { * [x1, y1, x2, y2] widget rectangle */ widgetRect?: number[]; + /** + * Page number where the widget should be placed + */ + widgetPage?: number; /** * Name of the application generating the signature */ diff --git a/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts.map b/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts.map index 3d2edf47..ac2a57f7 100644 --- a/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts.map +++ b/packages/placeholder-plain/dist/plainAddPlaceholder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"plainAddPlaceholder.d.ts","sourceRoot":"","sources":["../src/plainAddPlaceholder.js"],"names":[],"mappings":"AA2DO,uJAHI,SAAS,GACP,MAAM,CAiGlB;;eAvHY,MAAM;YACN,MAAM;iBACN,MAAM;UACN,MAAM;cACN,MAAM;kBACN,IAAI;sBACJ,MAAM;;;;gBACN,MAAM;;;;iBACN,MAAM,EAAE;;;;cACR,MAAM"} \ No newline at end of file +{"version":3,"file":"plainAddPlaceholder.d.ts","sourceRoot":"","sources":["../src/plainAddPlaceholder.js"],"names":[],"mappings":"AA4DO,mKAHI,SAAS,GACP,MAAM,CAmGlB;;eA1HY,MAAM;YACN,MAAM;iBACN,MAAM;UACN,MAAM;cACN,MAAM;kBACN,IAAI;sBACJ,MAAM;;;;gBACN,MAAM;;;;iBACN,MAAM,EAAE;;;;iBACR,MAAM;;;;cACN,MAAM"} \ No newline at end of file diff --git a/packages/placeholder-plain/dist/plainAddPlaceholder.js b/packages/placeholder-plain/dist/plainAddPlaceholder.js index 4a7e13f8..5bf4c028 100644 --- a/packages/placeholder-plain/dist/plainAddPlaceholder.js +++ b/packages/placeholder-plain/dist/plainAddPlaceholder.js @@ -39,6 +39,7 @@ const getAcroFormRef = slice => { * @property {number} [signatureLength] * @property {string} [subFilter] One of SUBFILTER_* from \@signpdf/utils * @property {number[]} [widgetRect] [x1, y1, x2, y2] widget rectangle +* @property {number} [widgetPage] Page number where the widget should be placed * @property {string} [appName] Name of the application generating the signature */ @@ -64,11 +65,12 @@ const plainAddPlaceholder = ({ signatureLength = _utils.DEFAULT_SIGNATURE_LENGTH, subFilter = _utils.SUBFILTER_ADOBE_PKCS7_DETACHED, widgetRect = [0, 0, 0, 0], + widgetPage = 0, appName = undefined }) => { let pdf = (0, _utils.removeTrailingNewLine)(pdfBuffer); const info = (0, _readPdf.default)(pdf); - const pageRef = (0, _getPageRef.default)(pdf, info); + const pageRef = (0, _getPageRef.default)(pdf, info, widgetPage); const pageIndex = (0, _getIndexFromRef.default)(info.xref, pageRef); const addedReferences = new Map(); const pdfKitMock = { @@ -109,6 +111,7 @@ const plainAddPlaceholder = ({ signatureLength, subFilter, widgetRect, + widgetPage, appName }); if (!getAcroFormRef(pdf.toString())) { diff --git a/packages/placeholder-plain/src/getPageRef.js b/packages/placeholder-plain/src/getPageRef.js index 64c16dd1..5e2a8662 100644 --- a/packages/placeholder-plain/src/getPageRef.js +++ b/packages/placeholder-plain/src/getPageRef.js @@ -1,3 +1,4 @@ +import {SignPdfError} from '@signpdf/utils'; import getPagesDictionaryRef from './getPagesDictionaryRef'; import findObject from './findObject'; @@ -6,14 +7,19 @@ import findObject from './findObject'; * * @param {Buffer} pdfBuffer * @param {Object} info As extracted from readRef() + * @param {Number} [pageNumber = 0] Desired page number */ -export default function getPageRef(pdfBuffer, info) { +export default function getPageRef(pdfBuffer, info, pageNumber = 0) { const pagesRef = getPagesDictionaryRef(info); const pagesDictionary = findObject(pdfBuffer, info.xref, pagesRef); const kidsPosition = pagesDictionary.indexOf('/Kids'); const kidsStart = pagesDictionary.indexOf('[', kidsPosition) + 1; const kidsEnd = pagesDictionary.indexOf(']', kidsPosition); const pages = pagesDictionary.slice(kidsStart, kidsEnd).toString(); - const split = pages.trim().split(' ', 3); - return `${split[0]} ${split[1]} ${split[2]}`; + const pagesSplit = []; + pages.trim().split(' ').forEach((v, i) => (i % 3 === 0 ? pagesSplit.push([v]) : pagesSplit[pagesSplit.length - 1].push(v))); + if (pageNumber < 0 || pagesSplit.length <= pageNumber) { + throw new SignPdfError(`Failed to get reference of page "${pageNumber}".`, SignPdfError.TYPE_INPUT); + } + return pagesSplit[pageNumber].join(' '); } diff --git a/packages/placeholder-plain/src/plainAddPlaceholder.js b/packages/placeholder-plain/src/plainAddPlaceholder.js index f26759b2..41780329 100644 --- a/packages/placeholder-plain/src/plainAddPlaceholder.js +++ b/packages/placeholder-plain/src/plainAddPlaceholder.js @@ -42,6 +42,7 @@ const getAcroFormRef = (slice) => { * @property {number} [signatureLength] * @property {string} [subFilter] One of SUBFILTER_* from \@signpdf/utils * @property {number[]} [widgetRect] [x1, y1, x2, y2] widget rectangle +* @property {number} [widgetPage] Page number where the widget should be placed * @property {string} [appName] Name of the application generating the signature */ @@ -67,11 +68,12 @@ export const plainAddPlaceholder = ({ signatureLength = DEFAULT_SIGNATURE_LENGTH, subFilter = SUBFILTER_ADOBE_PKCS7_DETACHED, widgetRect = [0, 0, 0, 0], + widgetPage = 0, appName = undefined, }) => { let pdf = removeTrailingNewLine(pdfBuffer); const info = readPdf(pdf); - const pageRef = getPageRef(pdf, info); + const pageRef = getPageRef(pdf, info, widgetPage); const pageIndex = getIndexFromRef(info.xref, pageRef); const addedReferences = new Map(); @@ -126,6 +128,7 @@ export const plainAddPlaceholder = ({ signatureLength, subFilter, widgetRect, + widgetPage, appName, });