Skip to content

Commit 0f20522

Browse files
author
Sebastian Straub
committed
Add widget page support for placeholder-plain
1 parent 4a6a2a4 commit 0f20522

File tree

8 files changed

+35
-12
lines changed

8 files changed

+35
-12
lines changed

packages/placeholder-plain/dist/getPageRef.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*
44
* @param {Buffer} pdfBuffer
55
* @param {Object} info As extracted from readRef()
6+
* @param {Number} [pageNumber = 0] Desired page number
67
*/
7-
export default function getPageRef(pdfBuffer: Buffer, info: any): string;
8+
export default function getPageRef(pdfBuffer: Buffer, info: any, pageNumber?: number): any;
89
//# sourceMappingURL=getPageRef.d.ts.map

packages/placeholder-plain/dist/getPageRef.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/placeholder-plain/dist/getPageRef.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
44
value: true
55
});
66
exports.default = getPageRef;
7+
var _utils = require("@signpdf/utils");
78
var _getPagesDictionaryRef = _interopRequireDefault(require("./getPagesDictionaryRef"));
89
var _findObject = _interopRequireDefault(require("./findObject"));
910
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -12,14 +13,19 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
1213
*
1314
* @param {Buffer} pdfBuffer
1415
* @param {Object} info As extracted from readRef()
16+
* @param {Number} [pageNumber = 0] Desired page number
1517
*/
16-
function getPageRef(pdfBuffer, info) {
18+
function getPageRef(pdfBuffer, info, pageNumber = 0) {
1719
const pagesRef = (0, _getPagesDictionaryRef.default)(info);
1820
const pagesDictionary = (0, _findObject.default)(pdfBuffer, info.xref, pagesRef);
1921
const kidsPosition = pagesDictionary.indexOf('/Kids');
2022
const kidsStart = pagesDictionary.indexOf('[', kidsPosition) + 1;
2123
const kidsEnd = pagesDictionary.indexOf(']', kidsPosition);
2224
const pages = pagesDictionary.slice(kidsStart, kidsEnd).toString();
23-
const split = pages.trim().split(' ', 3);
24-
return `${split[0]} ${split[1]} ${split[2]}`;
25+
const pagesSplit = [];
26+
pages.trim().split(' ').forEach((v, i) => i % 3 === 0 ? pagesSplit.push([v]) : pagesSplit[pagesSplit.length - 1].push(v));
27+
if (pageNumber < 0 || pagesSplit.length <= pageNumber) {
28+
throw new _utils.SignPdfError(`Failed to get reference of page "${pageNumber}".`, _utils.SignPdfError.TYPE_INPUT);
29+
}
30+
return pagesSplit[pageNumber].join(' ');
2531
}

packages/placeholder-plain/dist/plainAddPlaceholder.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export function plainAddPlaceholder({ pdfBuffer, reason, contactInfo, name, location, signingTime, signatureLength, subFilter, widgetRect, appName, }: InputType): Buffer;
1+
export function plainAddPlaceholder({ pdfBuffer, reason, contactInfo, name, location, signingTime, signatureLength, subFilter, widgetRect, widgetPage, appName, }: InputType): Buffer;
22
export type InputType = {
33
pdfBuffer: Buffer;
44
reason: string;
@@ -15,6 +15,10 @@ export type InputType = {
1515
* [x1, y1, x2, y2] widget rectangle
1616
*/
1717
widgetRect?: number[];
18+
/**
19+
* Page number where the widget should be placed
20+
*/
21+
widgetPage?: number;
1822
/**
1923
* Name of the application generating the signature
2024
*/

packages/placeholder-plain/dist/plainAddPlaceholder.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/placeholder-plain/dist/plainAddPlaceholder.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ const getAcroFormRef = slice => {
3939
* @property {number} [signatureLength]
4040
* @property {string} [subFilter] One of SUBFILTER_* from \@signpdf/utils
4141
* @property {number[]} [widgetRect] [x1, y1, x2, y2] widget rectangle
42+
* @property {number} [widgetPage] Page number where the widget should be placed
4243
* @property {string} [appName] Name of the application generating the signature
4344
*/
4445

@@ -64,11 +65,12 @@ const plainAddPlaceholder = ({
6465
signatureLength = _utils.DEFAULT_SIGNATURE_LENGTH,
6566
subFilter = _utils.SUBFILTER_ADOBE_PKCS7_DETACHED,
6667
widgetRect = [0, 0, 0, 0],
68+
widgetPage = 0,
6769
appName = undefined
6870
}) => {
6971
let pdf = (0, _utils.removeTrailingNewLine)(pdfBuffer);
7072
const info = (0, _readPdf.default)(pdf);
71-
const pageRef = (0, _getPageRef.default)(pdf, info);
73+
const pageRef = (0, _getPageRef.default)(pdf, info, widgetPage);
7274
const pageIndex = (0, _getIndexFromRef.default)(info.xref, pageRef);
7375
const addedReferences = new Map();
7476
const pdfKitMock = {
@@ -109,6 +111,7 @@ const plainAddPlaceholder = ({
109111
signatureLength,
110112
subFilter,
111113
widgetRect,
114+
widgetPage,
112115
appName
113116
});
114117
if (!getAcroFormRef(pdf.toString())) {
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {SignPdfError} from '@signpdf/utils';
12
import getPagesDictionaryRef from './getPagesDictionaryRef';
23
import findObject from './findObject';
34

@@ -6,14 +7,19 @@ import findObject from './findObject';
67
*
78
* @param {Buffer} pdfBuffer
89
* @param {Object} info As extracted from readRef()
10+
* @param {Number} [pageNumber = 0] Desired page number
911
*/
10-
export default function getPageRef(pdfBuffer, info) {
12+
export default function getPageRef(pdfBuffer, info, pageNumber = 0) {
1113
const pagesRef = getPagesDictionaryRef(info);
1214
const pagesDictionary = findObject(pdfBuffer, info.xref, pagesRef);
1315
const kidsPosition = pagesDictionary.indexOf('/Kids');
1416
const kidsStart = pagesDictionary.indexOf('[', kidsPosition) + 1;
1517
const kidsEnd = pagesDictionary.indexOf(']', kidsPosition);
1618
const pages = pagesDictionary.slice(kidsStart, kidsEnd).toString();
17-
const split = pages.trim().split(' ', 3);
18-
return `${split[0]} ${split[1]} ${split[2]}`;
19+
const pagesSplit = [];
20+
pages.trim().split(' ').forEach((v, i) => (i % 3 === 0 ? pagesSplit.push([v]) : pagesSplit[pagesSplit.length - 1].push(v)));
21+
if (pageNumber < 0 || pagesSplit.length <= pageNumber) {
22+
throw new SignPdfError(`Failed to get reference of page "${pageNumber}".`, SignPdfError.TYPE_INPUT);
23+
}
24+
return pagesSplit[pageNumber].join(' ');
1925
}

packages/placeholder-plain/src/plainAddPlaceholder.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const getAcroFormRef = (slice) => {
4242
* @property {number} [signatureLength]
4343
* @property {string} [subFilter] One of SUBFILTER_* from \@signpdf/utils
4444
* @property {number[]} [widgetRect] [x1, y1, x2, y2] widget rectangle
45+
* @property {number} [widgetPage] Page number where the widget should be placed
4546
* @property {string} [appName] Name of the application generating the signature
4647
*/
4748

@@ -67,11 +68,12 @@ export const plainAddPlaceholder = ({
6768
signatureLength = DEFAULT_SIGNATURE_LENGTH,
6869
subFilter = SUBFILTER_ADOBE_PKCS7_DETACHED,
6970
widgetRect = [0, 0, 0, 0],
71+
widgetPage = 0,
7072
appName = undefined,
7173
}) => {
7274
let pdf = removeTrailingNewLine(pdfBuffer);
7375
const info = readPdf(pdf);
74-
const pageRef = getPageRef(pdf, info);
76+
const pageRef = getPageRef(pdf, info, widgetPage);
7577
const pageIndex = getIndexFromRef(info.xref, pageRef);
7678
const addedReferences = new Map();
7779

@@ -126,6 +128,7 @@ export const plainAddPlaceholder = ({
126128
signatureLength,
127129
subFilter,
128130
widgetRect,
131+
widgetPage,
129132
appName,
130133
});
131134

0 commit comments

Comments
 (0)