@adnsistemas/pdf-lib 2.7.1 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/core/writers/PDFWriter.d.ts +15 -0
- package/cjs/core/writers/PDFWriter.d.ts.map +1 -1
- package/cjs/core/writers/PDFWriter.js +41 -3
- package/cjs/core/writers/PDFWriter.js.map +1 -1
- package/dist/pdf-lib.esm.js +39 -3
- package/dist/pdf-lib.esm.js.map +1 -1
- package/dist/pdf-lib.esm.min.js +1 -1
- package/dist/pdf-lib.esm.min.js.map +1 -1
- package/dist/pdf-lib.js +39 -3
- package/dist/pdf-lib.js.map +1 -1
- package/dist/pdf-lib.min.js +3 -3
- package/dist/pdf-lib.min.js.map +1 -1
- package/es/core/writers/PDFWriter.d.ts +15 -0
- package/es/core/writers/PDFWriter.d.ts.map +1 -1
- package/es/core/writers/PDFWriter.js +41 -3
- package/es/core/writers/PDFWriter.js.map +1 -1
- package/package.json +1 -1
- package/src/core/writers/PDFWriter.ts +49 -3
- package/ts3.4/cjs/core/writers/PDFWriter.d.ts +15 -0
- package/ts3.4/es/core/writers/PDFWriter.d.ts +15 -0
|
@@ -24,6 +24,21 @@ declare class PDFWriter {
|
|
|
24
24
|
protected readonly snapshot: DocumentSnapshot;
|
|
25
25
|
private parsedObjects;
|
|
26
26
|
protected constructor(context: PDFContext, objectsPerTick: number, snapshot: DocumentSnapshot);
|
|
27
|
+
/**
|
|
28
|
+
* If PDF has an XRef Stream, then the last object will be probably be skipped on saving.
|
|
29
|
+
* If that's the case, this property will have that object number, and the PDF /Size can
|
|
30
|
+
* be corrected, to be accurate.
|
|
31
|
+
*/
|
|
32
|
+
protected _largestSkippedObjectNum: number;
|
|
33
|
+
/**
|
|
34
|
+
* For incremental saves, defers the decision to the snapshot.
|
|
35
|
+
* For full saves, checks that the object is not an XRef stream object.
|
|
36
|
+
* @param {boolean} incremental If making an incremental save, or a full save of the PDF
|
|
37
|
+
* @param {number} objNum Object number
|
|
38
|
+
* @param {PDFObject} object PDFObject used to check if it is an XRef stream, when not 'incremental' saving
|
|
39
|
+
* @returns {boolean} whether the object should be saved or not
|
|
40
|
+
*/
|
|
41
|
+
protected shouldSave(incremental: boolean, objNum: number, object: PDFObject): boolean;
|
|
27
42
|
serializeToBuffer(): Promise<Uint8Array>;
|
|
28
43
|
protected computeIndirectObjectSize([ref, object]: [
|
|
29
44
|
PDFRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PDFWriter.d.ts","sourceRoot":"","sources":["../../../src/core/writers/PDFWriter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAC7C,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,UAAU,MAAM,eAAe,CAAC;AAKvC,OAAO,WAAW,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"PDFWriter.d.ts","sourceRoot":"","sources":["../../../src/core/writers/PDFWriter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAC7C,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,UAAU,MAAM,eAAe,CAAC;AAKvC,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAKlD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;IACvC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,OAAO,EAAE,UAAU,CAAC;CACrB;AAED,cAAM,SAAS;IACb,MAAM,CAAC,UAAU,YAAa,UAAU,kBAAkB,MAAM,eACE;IAElE,MAAM,CAAC,sBAAsB,YAClB,UAAU,kBACH,MAAM,YACZ,gBAAgB,eAC0B;IAEtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAEvC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC9C,OAAO,CAAC,aAAa,CAAK;IAE1B,SAAS,aACP,OAAO,EAAE,UAAU,EACnB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,gBAAgB;IAO5B;;;;OAIG;IACH,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAK;IAE/C;;;;;;;OAOG;IACH,SAAS,CAAC,UAAU,CAClB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAChB,OAAO;IAeJ,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC;IAmE9C,SAAS,CAAC,yBAAyB,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE;QACjD,MAAM;QACN,SAAS;KACV,GAAG,MAAM;IAMV,SAAS,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;cAoB5C,iBAAiB,CAC/B,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,iBAAiB,CAAC;IAoD7B,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW;IAYvE,SAAS,CAAC,iBAAiB,MAAO,MAAM,aAGtC;CACH;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -10,9 +10,17 @@ import CharCodes from '../syntax/CharCodes.js';
|
|
|
10
10
|
import { copyStringIntoBuffer, waitForTick } from '../../utils/index.js';
|
|
11
11
|
import PDFNumber from '../objects/PDFNumber.js';
|
|
12
12
|
import PDFStream from '../objects/PDFStream.js';
|
|
13
|
+
import PDFName from '../objects/PDFName.js';
|
|
14
|
+
import PDFRawStream from '../objects/PDFRawStream.js';
|
|
13
15
|
class PDFWriter {
|
|
14
16
|
constructor(context, objectsPerTick, snapshot) {
|
|
15
17
|
this.parsedObjects = 0;
|
|
18
|
+
/**
|
|
19
|
+
* If PDF has an XRef Stream, then the last object will be probably be skipped on saving.
|
|
20
|
+
* If that's the case, this property will have that object number, and the PDF /Size can
|
|
21
|
+
* be corrected, to be accurate.
|
|
22
|
+
*/
|
|
23
|
+
this._largestSkippedObjectNum = 0;
|
|
16
24
|
this.shouldWaitForTick = (n) => {
|
|
17
25
|
this.parsedObjects += n;
|
|
18
26
|
return this.parsedObjects % this.objectsPerTick === 0;
|
|
@@ -21,6 +29,27 @@ class PDFWriter {
|
|
|
21
29
|
this.objectsPerTick = objectsPerTick;
|
|
22
30
|
this.snapshot = snapshot;
|
|
23
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* For incremental saves, defers the decision to the snapshot.
|
|
34
|
+
* For full saves, checks that the object is not an XRef stream object.
|
|
35
|
+
* @param {boolean} incremental If making an incremental save, or a full save of the PDF
|
|
36
|
+
* @param {number} objNum Object number
|
|
37
|
+
* @param {PDFObject} object PDFObject used to check if it is an XRef stream, when not 'incremental' saving
|
|
38
|
+
* @returns {boolean} whether the object should be saved or not
|
|
39
|
+
*/
|
|
40
|
+
shouldSave(incremental, objNum, object) {
|
|
41
|
+
let should = true;
|
|
42
|
+
if (incremental) {
|
|
43
|
+
should = this.snapshot.shouldSave(objNum);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
should = !(object instanceof PDFRawStream &&
|
|
47
|
+
object.dict.lookup(PDFName.of('Type')) === PDFName.of('XRef'));
|
|
48
|
+
}
|
|
49
|
+
if (!should && this._largestSkippedObjectNum < objNum)
|
|
50
|
+
this._largestSkippedObjectNum = objNum;
|
|
51
|
+
return should;
|
|
52
|
+
}
|
|
24
53
|
serializeToBuffer() {
|
|
25
54
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26
55
|
const incremental = !(this.snapshot instanceof DefaultDocumentSnapshot);
|
|
@@ -34,7 +63,7 @@ class PDFWriter {
|
|
|
34
63
|
buffer[offset++] = CharCodes.Newline;
|
|
35
64
|
for (let idx = 0, len = indirectObjects.length; idx < len; idx++) {
|
|
36
65
|
const [ref, object] = indirectObjects[idx];
|
|
37
|
-
if (!this.
|
|
66
|
+
if (!this.shouldSave(incremental, ref.objectNumber, object)) {
|
|
38
67
|
continue;
|
|
39
68
|
}
|
|
40
69
|
const objectNumber = String(ref.objectNumber);
|
|
@@ -80,8 +109,16 @@ class PDFWriter {
|
|
|
80
109
|
return refSize + objectSize;
|
|
81
110
|
}
|
|
82
111
|
createTrailerDict(prevStartXRef) {
|
|
112
|
+
/**
|
|
113
|
+
* if last object (XRef Stream) is not in the output, then size is one less.
|
|
114
|
+
* An XRef Stream object should always be the largest object number in PDF
|
|
115
|
+
*/
|
|
116
|
+
const size = this.context.largestObjectNumber +
|
|
117
|
+
(this._largestSkippedObjectNum === this.context.largestObjectNumber
|
|
118
|
+
? 0
|
|
119
|
+
: 1);
|
|
83
120
|
return this.context.obj({
|
|
84
|
-
Size:
|
|
121
|
+
Size: size,
|
|
85
122
|
Root: this.context.trailerInfo.Root,
|
|
86
123
|
Encrypt: this.context.trailerInfo.Encrypt,
|
|
87
124
|
Info: this.context.trailerInfo.Info,
|
|
@@ -91,6 +128,7 @@ class PDFWriter {
|
|
|
91
128
|
}
|
|
92
129
|
computeBufferSize(incremental) {
|
|
93
130
|
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
this._largestSkippedObjectNum = 0;
|
|
94
132
|
const header = PDFHeader.forVersion(1, 7);
|
|
95
133
|
let size = this.snapshot.pdfSize;
|
|
96
134
|
if (!incremental) {
|
|
@@ -103,7 +141,7 @@ class PDFWriter {
|
|
|
103
141
|
for (let idx = 0, len = indirectObjects.length; idx < len; idx++) {
|
|
104
142
|
const indirectObject = indirectObjects[idx];
|
|
105
143
|
const [ref, object] = indirectObject;
|
|
106
|
-
if (!this.
|
|
144
|
+
if (!this.shouldSave(incremental, ref.objectNumber, object))
|
|
107
145
|
continue;
|
|
108
146
|
if (security)
|
|
109
147
|
this.encrypt(ref, object, security);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PDFWriter.js","sourceRoot":"","sources":["../../../src/core/writers/PDFWriter.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,cAAc,MAAM,4BAA4B,CAAC;AAGxD,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAC5D,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAE7C,OAAO,SAAS,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"PDFWriter.js","sourceRoot":"","sources":["../../../src/core/writers/PDFWriter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adnsistemas/pdf-lib",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.2",
|
|
4
4
|
"description": "Create and modify PDF files with JavaScript",
|
|
5
5
|
"author": "Andrew Dillon <andrew.dillon.j@gmail.com>",
|
|
6
6
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
|
|
@@ -17,6 +17,8 @@ import { copyStringIntoBuffer, waitForTick } from '../../utils';
|
|
|
17
17
|
import PDFNumber from '../objects/PDFNumber';
|
|
18
18
|
import PDFSecurity from '../security/PDFSecurity';
|
|
19
19
|
import PDFStream from '../objects/PDFStream';
|
|
20
|
+
import PDFName from '../objects/PDFName';
|
|
21
|
+
import PDFRawStream from '../objects/PDFRawStream';
|
|
20
22
|
|
|
21
23
|
export interface SerializationInfo {
|
|
22
24
|
size: number;
|
|
@@ -53,6 +55,40 @@ class PDFWriter {
|
|
|
53
55
|
this.snapshot = snapshot;
|
|
54
56
|
}
|
|
55
57
|
|
|
58
|
+
/**
|
|
59
|
+
* If PDF has an XRef Stream, then the last object will be probably be skipped on saving.
|
|
60
|
+
* If that's the case, this property will have that object number, and the PDF /Size can
|
|
61
|
+
* be corrected, to be accurate.
|
|
62
|
+
*/
|
|
63
|
+
protected _largestSkippedObjectNum: number = 0;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* For incremental saves, defers the decision to the snapshot.
|
|
67
|
+
* For full saves, checks that the object is not an XRef stream object.
|
|
68
|
+
* @param {boolean} incremental If making an incremental save, or a full save of the PDF
|
|
69
|
+
* @param {number} objNum Object number
|
|
70
|
+
* @param {PDFObject} object PDFObject used to check if it is an XRef stream, when not 'incremental' saving
|
|
71
|
+
* @returns {boolean} whether the object should be saved or not
|
|
72
|
+
*/
|
|
73
|
+
protected shouldSave(
|
|
74
|
+
incremental: boolean,
|
|
75
|
+
objNum: number,
|
|
76
|
+
object: PDFObject,
|
|
77
|
+
): boolean {
|
|
78
|
+
let should = true;
|
|
79
|
+
if (incremental) {
|
|
80
|
+
should = this.snapshot.shouldSave(objNum);
|
|
81
|
+
} else {
|
|
82
|
+
should = !(
|
|
83
|
+
object instanceof PDFRawStream &&
|
|
84
|
+
object.dict.lookup(PDFName.of('Type')) === PDFName.of('XRef')
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
if (!should && this._largestSkippedObjectNum < objNum)
|
|
88
|
+
this._largestSkippedObjectNum = objNum;
|
|
89
|
+
return should;
|
|
90
|
+
}
|
|
91
|
+
|
|
56
92
|
async serializeToBuffer(): Promise<Uint8Array> {
|
|
57
93
|
const incremental = !(this.snapshot instanceof DefaultDocumentSnapshot);
|
|
58
94
|
const { size, header, indirectObjects, xref, trailerDict, trailer } =
|
|
@@ -70,7 +106,7 @@ class PDFWriter {
|
|
|
70
106
|
for (let idx = 0, len = indirectObjects.length; idx < len; idx++) {
|
|
71
107
|
const [ref, object] = indirectObjects[idx];
|
|
72
108
|
|
|
73
|
-
if (!this.
|
|
109
|
+
if (!this.shouldSave(incremental, ref.objectNumber, object)) {
|
|
74
110
|
continue;
|
|
75
111
|
}
|
|
76
112
|
|
|
@@ -130,8 +166,17 @@ class PDFWriter {
|
|
|
130
166
|
}
|
|
131
167
|
|
|
132
168
|
protected createTrailerDict(prevStartXRef?: number): PDFDict {
|
|
169
|
+
/**
|
|
170
|
+
* if last object (XRef Stream) is not in the output, then size is one less.
|
|
171
|
+
* An XRef Stream object should always be the largest object number in PDF
|
|
172
|
+
*/
|
|
173
|
+
const size =
|
|
174
|
+
this.context.largestObjectNumber +
|
|
175
|
+
(this._largestSkippedObjectNum === this.context.largestObjectNumber
|
|
176
|
+
? 0
|
|
177
|
+
: 1);
|
|
133
178
|
return this.context.obj({
|
|
134
|
-
Size:
|
|
179
|
+
Size: size,
|
|
135
180
|
Root: this.context.trailerInfo.Root,
|
|
136
181
|
Encrypt: this.context.trailerInfo.Encrypt,
|
|
137
182
|
Info: this.context.trailerInfo.Info,
|
|
@@ -143,6 +188,7 @@ class PDFWriter {
|
|
|
143
188
|
protected async computeBufferSize(
|
|
144
189
|
incremental: boolean,
|
|
145
190
|
): Promise<SerializationInfo> {
|
|
191
|
+
this._largestSkippedObjectNum = 0;
|
|
146
192
|
const header = PDFHeader.forVersion(1, 7);
|
|
147
193
|
|
|
148
194
|
let size = this.snapshot.pdfSize;
|
|
@@ -160,7 +206,7 @@ class PDFWriter {
|
|
|
160
206
|
for (let idx = 0, len = indirectObjects.length; idx < len; idx++) {
|
|
161
207
|
const indirectObject = indirectObjects[idx];
|
|
162
208
|
const [ref, object] = indirectObject;
|
|
163
|
-
if (!this.
|
|
209
|
+
if (!this.shouldSave(incremental, ref.objectNumber, object)) continue;
|
|
164
210
|
if (security) this.encrypt(ref, object, security);
|
|
165
211
|
xref.addEntry(ref, size);
|
|
166
212
|
size += this.computeIndirectObjectSize(indirectObject);
|
|
@@ -27,6 +27,21 @@ declare class PDFWriter {
|
|
|
27
27
|
protected readonly snapshot: DocumentSnapshot;
|
|
28
28
|
private parsedObjects;
|
|
29
29
|
protected constructor(context: PDFContext, objectsPerTick: number, snapshot: DocumentSnapshot);
|
|
30
|
+
/**
|
|
31
|
+
* If PDF has an XRef Stream, then the last object will be probably be skipped on saving.
|
|
32
|
+
* If that's the case, this property will have that object number, and the PDF /Size can
|
|
33
|
+
* be corrected, to be accurate.
|
|
34
|
+
*/
|
|
35
|
+
protected _largestSkippedObjectNum: number;
|
|
36
|
+
/**
|
|
37
|
+
* For incremental saves, defers the decision to the snapshot.
|
|
38
|
+
* For full saves, checks that the object is not an XRef stream object.
|
|
39
|
+
* @param {boolean} incremental If making an incremental save, or a full save of the PDF
|
|
40
|
+
* @param {number} objNum Object number
|
|
41
|
+
* @param {PDFObject} object PDFObject used to check if it is an XRef stream, when not 'incremental' saving
|
|
42
|
+
* @returns {boolean} whether the object should be saved or not
|
|
43
|
+
*/
|
|
44
|
+
protected shouldSave(incremental: boolean, objNum: number, object: PDFObject): boolean;
|
|
30
45
|
serializeToBuffer(): Promise<Uint8Array>;
|
|
31
46
|
protected computeIndirectObjectSize([ref, object]: [
|
|
32
47
|
PDFRef,
|
|
@@ -27,6 +27,21 @@ declare class PDFWriter {
|
|
|
27
27
|
protected readonly snapshot: DocumentSnapshot;
|
|
28
28
|
private parsedObjects;
|
|
29
29
|
protected constructor(context: PDFContext, objectsPerTick: number, snapshot: DocumentSnapshot);
|
|
30
|
+
/**
|
|
31
|
+
* If PDF has an XRef Stream, then the last object will be probably be skipped on saving.
|
|
32
|
+
* If that's the case, this property will have that object number, and the PDF /Size can
|
|
33
|
+
* be corrected, to be accurate.
|
|
34
|
+
*/
|
|
35
|
+
protected _largestSkippedObjectNum: number;
|
|
36
|
+
/**
|
|
37
|
+
* For incremental saves, defers the decision to the snapshot.
|
|
38
|
+
* For full saves, checks that the object is not an XRef stream object.
|
|
39
|
+
* @param {boolean} incremental If making an incremental save, or a full save of the PDF
|
|
40
|
+
* @param {number} objNum Object number
|
|
41
|
+
* @param {PDFObject} object PDFObject used to check if it is an XRef stream, when not 'incremental' saving
|
|
42
|
+
* @returns {boolean} whether the object should be saved or not
|
|
43
|
+
*/
|
|
44
|
+
protected shouldSave(incremental: boolean, objNum: number, object: PDFObject): boolean;
|
|
30
45
|
serializeToBuffer(): Promise<Uint8Array>;
|
|
31
46
|
protected computeIndirectObjectSize([ref, object]: [
|
|
32
47
|
PDFRef,
|