@vaadin-component-factory/vcf-pdf-viewer 0.9.0 → 1.0.0
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/README.md +1 -1
- package/package.json +42 -26
- package/{src/display → pdfjs/dist}/display_utils.js +344 -139
- package/{src/display → pdfjs/dist}/fetch_stream.js +115 -97
- package/pdfjs/dist/l10n_utils.js +140 -0
- package/{src/shared → pdfjs/dist}/message_handler.js +243 -259
- package/{src/display → pdfjs/dist}/network.js +149 -87
- package/{src/display/content_disposition.js → pdfjs/dist/network_utils.js} +167 -55
- package/{src/display → pdfjs/dist}/node_stream.js +133 -98
- package/pdfjs/dist/pdf.js +12778 -0
- package/pdfjs/dist/pdf_link_service.js +638 -0
- package/pdfjs/dist/pdf_rendering_queue.js +199 -0
- package/pdfjs/dist/pdf_thumbnail_viewer.js +819 -0
- package/pdfjs/dist/pdf_viewer.js +3598 -0
- package/pdfjs/dist/ui_utils.js +1033 -0
- package/{src/shared → pdfjs/dist}/util.js +301 -287
- package/pdfjs/dist/worker.js +62813 -0
- package/src/vcf-pdf-viewer.js +98 -46
- package/theme/lumo/vcf-pdf-viewer-styles.js +4 -4
- package/theme/material/vcf-pdf-viewer-styles.js +4 -4
- package/theme/material/vcf-pdf-viewer.js +2 -2
- package/src/core/.eslintrc +0 -13
- package/src/core/annotation.js +0 -2948
- package/src/core/arithmetic_decoder.js +0 -182
- package/src/core/ascii_85_stream.js +0 -98
- package/src/core/ascii_hex_stream.js +0 -79
- package/src/core/base_stream.js +0 -110
- package/src/core/bidi.js +0 -438
- package/src/core/calibri_factors.js +0 -308
- package/src/core/catalog.js +0 -1459
- package/src/core/ccitt.js +0 -1062
- package/src/core/ccitt_stream.js +0 -60
- package/src/core/cff_font.js +0 -116
- package/src/core/cff_parser.js +0 -1949
- package/src/core/charsets.js +0 -119
- package/src/core/chunked_stream.js +0 -557
- package/src/core/cmap.js +0 -1039
- package/src/core/colorspace.js +0 -1533
- package/src/core/core_utils.js +0 -464
- package/src/core/crypto.js +0 -1900
- package/src/core/decode_stream.js +0 -170
- package/src/core/decrypt_stream.js +0 -59
- package/src/core/default_appearance.js +0 -99
- package/src/core/document.js +0 -1456
- package/src/core/encodings.js +0 -301
- package/src/core/evaluator.js +0 -4601
- package/src/core/file_spec.js +0 -108
- package/src/core/flate_stream.js +0 -402
- package/src/core/font_renderer.js +0 -882
- package/src/core/fonts.js +0 -3260
- package/src/core/fonts_utils.js +0 -221
- package/src/core/function.js +0 -1257
- package/src/core/glyf.js +0 -706
- package/src/core/glyphlist.js +0 -4558
- package/src/core/helvetica_factors.js +0 -353
- package/src/core/image.js +0 -802
- package/src/core/image_utils.js +0 -291
- package/src/core/jbig2.js +0 -2572
- package/src/core/jbig2_stream.js +0 -73
- package/src/core/jpeg_stream.js +0 -105
- package/src/core/jpg.js +0 -1416
- package/src/core/jpx.js +0 -2343
- package/src/core/jpx_stream.js +0 -87
- package/src/core/liberationsans_widths.js +0 -221
- package/src/core/lzw_stream.js +0 -150
- package/src/core/metadata_parser.js +0 -146
- package/src/core/metrics.js +0 -2970
- package/src/core/murmurhash3.js +0 -139
- package/src/core/myriadpro_factors.js +0 -290
- package/src/core/name_number_tree.js +0 -153
- package/src/core/object_loader.js +0 -149
- package/src/core/opentype_file_builder.js +0 -154
- package/src/core/operator_list.js +0 -734
- package/src/core/parser.js +0 -1416
- package/src/core/pattern.js +0 -985
- package/src/core/pdf_manager.js +0 -217
- package/src/core/predictor_stream.js +0 -238
- package/src/core/primitives.js +0 -402
- package/src/core/ps_parser.js +0 -272
- package/src/core/run_length_stream.js +0 -61
- package/src/core/segoeui_factors.js +0 -308
- package/src/core/standard_fonts.js +0 -817
- package/src/core/stream.js +0 -103
- package/src/core/struct_tree.js +0 -335
- package/src/core/to_unicode_map.js +0 -103
- package/src/core/type1_font.js +0 -421
- package/src/core/type1_parser.js +0 -776
- package/src/core/unicode.js +0 -1649
- package/src/core/worker.js +0 -848
- package/src/core/worker_stream.js +0 -135
- package/src/core/writer.js +0 -278
- package/src/core/xfa/bind.js +0 -652
- package/src/core/xfa/builder.js +0 -207
- package/src/core/xfa/config.js +0 -1926
- package/src/core/xfa/connection_set.js +0 -202
- package/src/core/xfa/data.js +0 -82
- package/src/core/xfa/datasets.js +0 -76
- package/src/core/xfa/factory.js +0 -111
- package/src/core/xfa/fonts.js +0 -181
- package/src/core/xfa/formcalc_lexer.js +0 -385
- package/src/core/xfa/formcalc_parser.js +0 -1340
- package/src/core/xfa/html_utils.js +0 -639
- package/src/core/xfa/layout.js +0 -383
- package/src/core/xfa/locale_set.js +0 -345
- package/src/core/xfa/namespaces.js +0 -81
- package/src/core/xfa/parser.js +0 -184
- package/src/core/xfa/setup.js +0 -38
- package/src/core/xfa/signature.js +0 -40
- package/src/core/xfa/som.js +0 -338
- package/src/core/xfa/stylesheet.js +0 -40
- package/src/core/xfa/template.js +0 -6260
- package/src/core/xfa/text.js +0 -290
- package/src/core/xfa/unknown.js +0 -29
- package/src/core/xfa/utils.js +0 -217
- package/src/core/xfa/xdp.js +0 -59
- package/src/core/xfa/xfa_object.js +0 -1130
- package/src/core/xfa/xhtml.js +0 -543
- package/src/core/xfa_fonts.js +0 -208
- package/src/core/xml_parser.js +0 -507
- package/src/core/xref.js +0 -899
- package/src/display/annotation_layer.js +0 -2107
- package/src/display/annotation_storage.js +0 -113
- package/src/display/api.js +0 -3292
- package/src/display/base_factory.js +0 -180
- package/src/display/canvas.js +0 -2828
- package/src/display/font_loader.js +0 -484
- package/src/display/metadata.js +0 -41
- package/src/display/network_utils.js +0 -100
- package/src/display/node_utils.js +0 -83
- package/src/display/optional_content_config.js +0 -189
- package/src/display/pattern_helper.js +0 -659
- package/src/display/svg.js +0 -1709
- package/src/display/text_layer.js +0 -847
- package/src/display/transport_stream.js +0 -303
- package/src/display/worker_options.js +0 -40
- package/src/display/xfa_layer.js +0 -204
- package/src/doc_helper.js +0 -25
- package/src/images/logo.svg +0 -41
- package/src/interfaces.js +0 -169
- package/src/license_header.js +0 -14
- package/src/license_header_libre.js +0 -21
- package/src/pdf.image_decoders.js +0 -46
- package/src/pdf.js +0 -146
- package/src/pdf.sandbox.external.js +0 -181
- package/src/pdf.sandbox.js +0 -151
- package/src/pdf.scripting.js +0 -25
- package/src/pdf.worker.entry.js +0 -19
- package/src/pdf.worker.js +0 -23
- package/src/scripting_api/aform.js +0 -608
- package/src/scripting_api/app.js +0 -621
- package/src/scripting_api/color.js +0 -129
- package/src/scripting_api/common.js +0 -58
- package/src/scripting_api/console.js +0 -38
- package/src/scripting_api/constants.js +0 -208
- package/src/scripting_api/doc.js +0 -1195
- package/src/scripting_api/error.js +0 -23
- package/src/scripting_api/event.js +0 -232
- package/src/scripting_api/field.js +0 -620
- package/src/scripting_api/fullscreen.js +0 -145
- package/src/scripting_api/initialization.js +0 -223
- package/src/scripting_api/pdf_object.js +0 -24
- package/src/scripting_api/print_params.js +0 -146
- package/src/scripting_api/proxy.js +0 -139
- package/src/scripting_api/thermometer.js +0 -69
- package/src/scripting_api/util.js +0 -581
- package/src/shared/.eslintrc +0 -13
- package/src/shared/cffStandardStrings.js +0 -311
- package/src/shared/compatibility.js +0 -114
- package/src/shared/fonts_utils.js +0 -429
- package/src/shared/is_node.js +0 -27
- package/src/shared/scripting_utils.js +0 -85
- package/src/worker_loader.js +0 -32
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/* Copyright 2019 Mozilla Foundation
|
|
2
|
-
*
|
|
3
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
* you may not use this file except in compliance with the License.
|
|
5
|
-
* You may obtain a copy of the License at
|
|
6
|
-
*
|
|
7
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
*
|
|
9
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
* See the License for the specific language governing permissions and
|
|
13
|
-
* limitations under the License.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { assert } from "../shared/util.js";
|
|
17
|
-
|
|
18
|
-
/** @implements {IPDFStream} */
|
|
19
|
-
class PDFWorkerStream {
|
|
20
|
-
constructor(msgHandler) {
|
|
21
|
-
this._msgHandler = msgHandler;
|
|
22
|
-
this._contentLength = null;
|
|
23
|
-
this._fullRequestReader = null;
|
|
24
|
-
this._rangeRequestReaders = [];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
getFullReader() {
|
|
28
|
-
assert(
|
|
29
|
-
!this._fullRequestReader,
|
|
30
|
-
"PDFWorkerStream.getFullReader can only be called once."
|
|
31
|
-
);
|
|
32
|
-
this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
|
|
33
|
-
return this._fullRequestReader;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
getRangeReader(begin, end) {
|
|
37
|
-
const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
|
|
38
|
-
this._rangeRequestReaders.push(reader);
|
|
39
|
-
return reader;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
cancelAllRequests(reason) {
|
|
43
|
-
if (this._fullRequestReader) {
|
|
44
|
-
this._fullRequestReader.cancel(reason);
|
|
45
|
-
}
|
|
46
|
-
for (const reader of this._rangeRequestReaders.slice(0)) {
|
|
47
|
-
reader.cancel(reason);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** @implements {IPDFStreamReader} */
|
|
53
|
-
class PDFWorkerStreamReader {
|
|
54
|
-
constructor(msgHandler) {
|
|
55
|
-
this._msgHandler = msgHandler;
|
|
56
|
-
this.onProgress = null;
|
|
57
|
-
|
|
58
|
-
this._contentLength = null;
|
|
59
|
-
this._isRangeSupported = false;
|
|
60
|
-
this._isStreamingSupported = false;
|
|
61
|
-
|
|
62
|
-
const readableStream = this._msgHandler.sendWithStream("GetReader");
|
|
63
|
-
this._reader = readableStream.getReader();
|
|
64
|
-
|
|
65
|
-
this._headersReady = this._msgHandler
|
|
66
|
-
.sendWithPromise("ReaderHeadersReady")
|
|
67
|
-
.then(data => {
|
|
68
|
-
this._isStreamingSupported = data.isStreamingSupported;
|
|
69
|
-
this._isRangeSupported = data.isRangeSupported;
|
|
70
|
-
this._contentLength = data.contentLength;
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
get headersReady() {
|
|
75
|
-
return this._headersReady;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
get contentLength() {
|
|
79
|
-
return this._contentLength;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
get isStreamingSupported() {
|
|
83
|
-
return this._isStreamingSupported;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
get isRangeSupported() {
|
|
87
|
-
return this._isRangeSupported;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async read() {
|
|
91
|
-
const { value, done } = await this._reader.read();
|
|
92
|
-
if (done) {
|
|
93
|
-
return { value: undefined, done: true };
|
|
94
|
-
}
|
|
95
|
-
// `value` is wrapped into Uint8Array, we need to
|
|
96
|
-
// unwrap it to ArrayBuffer for further processing.
|
|
97
|
-
return { value: value.buffer, done: false };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
cancel(reason) {
|
|
101
|
-
this._reader.cancel(reason);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** @implements {IPDFStreamRangeReader} */
|
|
106
|
-
class PDFWorkerStreamRangeReader {
|
|
107
|
-
constructor(begin, end, msgHandler) {
|
|
108
|
-
this._msgHandler = msgHandler;
|
|
109
|
-
this.onProgress = null;
|
|
110
|
-
|
|
111
|
-
const readableStream = this._msgHandler.sendWithStream("GetRangeReader", {
|
|
112
|
-
begin,
|
|
113
|
-
end,
|
|
114
|
-
});
|
|
115
|
-
this._reader = readableStream.getReader();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
get isStreamingSupported() {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
async read() {
|
|
123
|
-
const { value, done } = await this._reader.read();
|
|
124
|
-
if (done) {
|
|
125
|
-
return { value: undefined, done: true };
|
|
126
|
-
}
|
|
127
|
-
return { value: value.buffer, done: false };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
cancel(reason) {
|
|
131
|
-
this._reader.cancel(reason);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export { PDFWorkerStream };
|
package/src/core/writer.js
DELETED
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/* Copyright 2020 Mozilla Foundation
|
|
2
|
-
*
|
|
3
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
* you may not use this file except in compliance with the License.
|
|
5
|
-
* You may obtain a copy of the License at
|
|
6
|
-
*
|
|
7
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
*
|
|
9
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
* See the License for the specific language governing permissions and
|
|
13
|
-
* limitations under the License.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { bytesToString, escapeString, warn } from "../shared/util.js";
|
|
17
|
-
import { Dict, isDict, isName, isRef, isStream, Name } from "./primitives.js";
|
|
18
|
-
import { escapePDFName, parseXFAPath } from "./core_utils.js";
|
|
19
|
-
import { SimpleDOMNode, SimpleXMLParser } from "./xml_parser.js";
|
|
20
|
-
import { calculateMD5 } from "./crypto.js";
|
|
21
|
-
|
|
22
|
-
function writeDict(dict, buffer, transform) {
|
|
23
|
-
buffer.push("<<");
|
|
24
|
-
for (const key of dict.getKeys()) {
|
|
25
|
-
buffer.push(` /${escapePDFName(key)} `);
|
|
26
|
-
writeValue(dict.getRaw(key), buffer, transform);
|
|
27
|
-
}
|
|
28
|
-
buffer.push(">>");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function writeStream(stream, buffer, transform) {
|
|
32
|
-
writeDict(stream.dict, buffer, transform);
|
|
33
|
-
buffer.push(" stream\n");
|
|
34
|
-
let string = stream.getString();
|
|
35
|
-
if (transform !== null) {
|
|
36
|
-
string = transform.encryptString(string);
|
|
37
|
-
}
|
|
38
|
-
buffer.push(string, "\nendstream\n");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function writeArray(array, buffer, transform) {
|
|
42
|
-
buffer.push("[");
|
|
43
|
-
let first = true;
|
|
44
|
-
for (const val of array) {
|
|
45
|
-
if (!first) {
|
|
46
|
-
buffer.push(" ");
|
|
47
|
-
} else {
|
|
48
|
-
first = false;
|
|
49
|
-
}
|
|
50
|
-
writeValue(val, buffer, transform);
|
|
51
|
-
}
|
|
52
|
-
buffer.push("]");
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function numberToString(value) {
|
|
56
|
-
if (Number.isInteger(value)) {
|
|
57
|
-
return value.toString();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const roundedValue = Math.round(value * 100);
|
|
61
|
-
if (roundedValue % 100 === 0) {
|
|
62
|
-
return (roundedValue / 100).toString();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (roundedValue % 10 === 0) {
|
|
66
|
-
return value.toFixed(1);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return value.toFixed(2);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function writeValue(value, buffer, transform) {
|
|
73
|
-
if (isName(value)) {
|
|
74
|
-
buffer.push(`/${escapePDFName(value.name)}`);
|
|
75
|
-
} else if (isRef(value)) {
|
|
76
|
-
buffer.push(`${value.num} ${value.gen} R`);
|
|
77
|
-
} else if (Array.isArray(value)) {
|
|
78
|
-
writeArray(value, buffer, transform);
|
|
79
|
-
} else if (typeof value === "string") {
|
|
80
|
-
if (transform !== null) {
|
|
81
|
-
value = transform.encryptString(value);
|
|
82
|
-
}
|
|
83
|
-
buffer.push(`(${escapeString(value)})`);
|
|
84
|
-
} else if (typeof value === "number") {
|
|
85
|
-
buffer.push(numberToString(value));
|
|
86
|
-
} else if (isDict(value)) {
|
|
87
|
-
writeDict(value, buffer, transform);
|
|
88
|
-
} else if (isStream(value)) {
|
|
89
|
-
writeStream(value, buffer, transform);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function writeInt(number, size, offset, buffer) {
|
|
94
|
-
for (let i = size + offset - 1; i > offset - 1; i--) {
|
|
95
|
-
buffer[i] = number & 0xff;
|
|
96
|
-
number >>= 8;
|
|
97
|
-
}
|
|
98
|
-
return offset + size;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function writeString(string, offset, buffer) {
|
|
102
|
-
for (let i = 0, len = string.length; i < len; i++) {
|
|
103
|
-
buffer[offset + i] = string.charCodeAt(i) & 0xff;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function computeMD5(filesize, xrefInfo) {
|
|
108
|
-
const time = Math.floor(Date.now() / 1000);
|
|
109
|
-
const filename = xrefInfo.filename || "";
|
|
110
|
-
const md5Buffer = [time.toString(), filename, filesize.toString()];
|
|
111
|
-
let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0);
|
|
112
|
-
for (const value of Object.values(xrefInfo.info)) {
|
|
113
|
-
md5Buffer.push(value);
|
|
114
|
-
md5BufferLen += value.length;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const array = new Uint8Array(md5BufferLen);
|
|
118
|
-
let offset = 0;
|
|
119
|
-
for (const str of md5Buffer) {
|
|
120
|
-
writeString(str, offset, array);
|
|
121
|
-
offset += str.length;
|
|
122
|
-
}
|
|
123
|
-
return bytesToString(calculateMD5(array));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function writeXFADataForAcroform(str, newRefs) {
|
|
127
|
-
const xml = new SimpleXMLParser({ hasAttributes: true }).parseFromString(str);
|
|
128
|
-
|
|
129
|
-
for (const { xfa } of newRefs) {
|
|
130
|
-
if (!xfa) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
const { path, value } = xfa;
|
|
134
|
-
if (!path) {
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
const node = xml.documentElement.searchNode(parseXFAPath(path), 0);
|
|
138
|
-
if (node) {
|
|
139
|
-
node.childNodes = [new SimpleDOMNode("#text", value)];
|
|
140
|
-
} else {
|
|
141
|
-
warn(`Node not found for path: ${path}`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
const buffer = [];
|
|
145
|
-
xml.documentElement.dump(buffer);
|
|
146
|
-
return buffer.join("");
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function updateXFA(xfaData, datasetsRef, newRefs, xref) {
|
|
150
|
-
if (datasetsRef === null || xref === null) {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (xfaData === null) {
|
|
154
|
-
const datasets = xref.fetchIfRef(datasetsRef);
|
|
155
|
-
xfaData = writeXFADataForAcroform(datasets.getString(), newRefs);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const encrypt = xref.encrypt;
|
|
159
|
-
if (encrypt) {
|
|
160
|
-
const transform = encrypt.createCipherTransform(
|
|
161
|
-
datasetsRef.num,
|
|
162
|
-
datasetsRef.gen
|
|
163
|
-
);
|
|
164
|
-
xfaData = transform.encryptString(xfaData);
|
|
165
|
-
}
|
|
166
|
-
const data =
|
|
167
|
-
`${datasetsRef.num} ${datasetsRef.gen} obj\n` +
|
|
168
|
-
`<< /Type /EmbeddedFile /Length ${xfaData.length}>>\nstream\n` +
|
|
169
|
-
xfaData +
|
|
170
|
-
"\nendstream\nendobj\n";
|
|
171
|
-
|
|
172
|
-
newRefs.push({ ref: datasetsRef, data });
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
function incrementalUpdate({
|
|
176
|
-
originalData,
|
|
177
|
-
xrefInfo,
|
|
178
|
-
newRefs,
|
|
179
|
-
xref = null,
|
|
180
|
-
datasetsRef = null,
|
|
181
|
-
xfaData = null,
|
|
182
|
-
}) {
|
|
183
|
-
updateXFA(xfaData, datasetsRef, newRefs, xref);
|
|
184
|
-
|
|
185
|
-
const newXref = new Dict(null);
|
|
186
|
-
const refForXrefTable = xrefInfo.newRef;
|
|
187
|
-
|
|
188
|
-
let buffer, baseOffset;
|
|
189
|
-
const lastByte = originalData[originalData.length - 1];
|
|
190
|
-
if (lastByte === /* \n */ 0x0a || lastByte === /* \r */ 0x0d) {
|
|
191
|
-
buffer = [];
|
|
192
|
-
baseOffset = originalData.length;
|
|
193
|
-
} else {
|
|
194
|
-
// Avoid to concatenate %%EOF with an object definition
|
|
195
|
-
buffer = ["\n"];
|
|
196
|
-
baseOffset = originalData.length + 1;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
newXref.set("Size", refForXrefTable.num + 1);
|
|
200
|
-
newXref.set("Prev", xrefInfo.startXRef);
|
|
201
|
-
newXref.set("Type", Name.get("XRef"));
|
|
202
|
-
|
|
203
|
-
if (xrefInfo.rootRef !== null) {
|
|
204
|
-
newXref.set("Root", xrefInfo.rootRef);
|
|
205
|
-
}
|
|
206
|
-
if (xrefInfo.infoRef !== null) {
|
|
207
|
-
newXref.set("Info", xrefInfo.infoRef);
|
|
208
|
-
}
|
|
209
|
-
if (xrefInfo.encryptRef !== null) {
|
|
210
|
-
newXref.set("Encrypt", xrefInfo.encryptRef);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Add a ref for the new xref and sort them
|
|
214
|
-
newRefs.push({ ref: refForXrefTable, data: "" });
|
|
215
|
-
newRefs = newRefs.sort((a, b) => {
|
|
216
|
-
// compare the refs
|
|
217
|
-
return a.ref.num - b.ref.num;
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
const xrefTableData = [[0, 1, 0xffff]];
|
|
221
|
-
const indexes = [0, 1];
|
|
222
|
-
let maxOffset = 0;
|
|
223
|
-
for (const { ref, data } of newRefs) {
|
|
224
|
-
maxOffset = Math.max(maxOffset, baseOffset);
|
|
225
|
-
xrefTableData.push([1, baseOffset, Math.min(ref.gen, 0xffff)]);
|
|
226
|
-
baseOffset += data.length;
|
|
227
|
-
indexes.push(ref.num, 1);
|
|
228
|
-
buffer.push(data);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
newXref.set("Index", indexes);
|
|
232
|
-
|
|
233
|
-
if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) {
|
|
234
|
-
const md5 = computeMD5(baseOffset, xrefInfo);
|
|
235
|
-
newXref.set("ID", [xrefInfo.fileIds[0], md5]);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const offsetSize = Math.ceil(Math.log2(maxOffset) / 8);
|
|
239
|
-
const sizes = [1, offsetSize, 2];
|
|
240
|
-
const structSize = sizes[0] + sizes[1] + sizes[2];
|
|
241
|
-
const tableLength = structSize * xrefTableData.length;
|
|
242
|
-
newXref.set("W", sizes);
|
|
243
|
-
newXref.set("Length", tableLength);
|
|
244
|
-
|
|
245
|
-
buffer.push(`${refForXrefTable.num} ${refForXrefTable.gen} obj\n`);
|
|
246
|
-
writeDict(newXref, buffer, null);
|
|
247
|
-
buffer.push(" stream\n");
|
|
248
|
-
|
|
249
|
-
const bufferLen = buffer.reduce((a, str) => a + str.length, 0);
|
|
250
|
-
const footer = `\nendstream\nendobj\nstartxref\n${baseOffset}\n%%EOF\n`;
|
|
251
|
-
const array = new Uint8Array(
|
|
252
|
-
originalData.length + bufferLen + tableLength + footer.length
|
|
253
|
-
);
|
|
254
|
-
|
|
255
|
-
// Original data
|
|
256
|
-
array.set(originalData);
|
|
257
|
-
let offset = originalData.length;
|
|
258
|
-
|
|
259
|
-
// New data
|
|
260
|
-
for (const str of buffer) {
|
|
261
|
-
writeString(str, offset, array);
|
|
262
|
-
offset += str.length;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// New xref table
|
|
266
|
-
for (const [type, objOffset, gen] of xrefTableData) {
|
|
267
|
-
offset = writeInt(type, sizes[0], offset, array);
|
|
268
|
-
offset = writeInt(objOffset, sizes[1], offset, array);
|
|
269
|
-
offset = writeInt(gen, sizes[2], offset, array);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Add the footer
|
|
273
|
-
writeString(footer, offset, array);
|
|
274
|
-
|
|
275
|
-
return array;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
export { incrementalUpdate, writeDict };
|