pdfjs-dist 2.0.943 → 2.4.456
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.
Potentially problematic release.
This version of pdfjs-dist might be problematic. Click here for more details.
- package/CODE_OF_CONDUCT.md +15 -0
- package/README.md +4 -0
- package/bower.json +1 -1
- package/build/pdf.js +8286 -14230
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +22 -1
- package/build/pdf.worker.entry.js +5 -3
- package/build/pdf.worker.js +25500 -26628
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +22 -1
- package/es5/build/pdf.js +25473 -0
- package/es5/build/pdf.js.map +1 -0
- package/{lib/shared/global_scope.js → es5/build/pdf.worker.entry.js} +5 -10
- package/es5/build/pdf.worker.js +57878 -0
- package/es5/build/pdf.worker.js.map +1 -0
- package/es5/web/images/annotation-check.svg +11 -0
- package/es5/web/images/annotation-comment.svg +16 -0
- package/es5/web/images/annotation-help.svg +26 -0
- package/es5/web/images/annotation-insert.svg +10 -0
- package/es5/web/images/annotation-key.svg +11 -0
- package/es5/web/images/annotation-newparagraph.svg +11 -0
- package/es5/web/images/annotation-noicon.svg +7 -0
- package/es5/web/images/annotation-note.svg +42 -0
- package/es5/web/images/annotation-paragraph.svg +16 -0
- package/es5/web/images/loading-icon.gif +0 -0
- package/es5/web/images/shadow.png +0 -0
- package/es5/web/images/texture.png +0 -0
- package/es5/web/pdf_viewer.css +407 -0
- package/es5/web/pdf_viewer.js +7757 -0
- package/es5/web/pdf_viewer.js.map +1 -0
- package/image_decoders/pdf.image_decoders.js +2887 -4094
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +22 -1
- package/lib/README.md +7 -0
- package/lib/core/annotation.js +855 -778
- package/lib/core/arithmetic_decoder.js +325 -311
- package/lib/core/bidi.js +117 -50
- package/lib/core/ccitt.js +251 -89
- package/lib/core/ccitt_stream.js +26 -16
- package/lib/core/cff_parser.js +525 -197
- package/lib/core/charsets.js +6 -5
- package/lib/core/chunked_stream.js +541 -406
- package/lib/core/cmap.js +368 -253
- package/lib/core/colorspace.js +781 -800
- package/lib/core/core_utils.js +152 -0
- package/lib/core/crypto.js +609 -422
- package/lib/core/document.js +649 -481
- package/lib/core/encodings.js +33 -24
- package/lib/core/evaluator.js +1471 -736
- package/lib/core/font_renderer.js +289 -149
- package/lib/core/fonts.js +1067 -413
- package/lib/core/function.js +517 -287
- package/lib/core/glyphlist.js +4529 -4527
- package/lib/core/image.js +232 -114
- package/lib/core/image_utils.js +94 -0
- package/lib/core/jbig2.js +711 -342
- package/lib/core/jbig2_stream.js +31 -19
- package/lib/core/jpeg_stream.js +151 -26
- package/lib/core/jpg.js +433 -181
- package/lib/core/jpx.js +551 -143
- package/lib/core/jpx_stream.js +40 -28
- package/lib/core/metrics.js +2931 -2931
- package/lib/core/murmurhash3.js +104 -97
- package/lib/core/obj.js +1561 -1053
- package/lib/core/operator_list.js +192 -64
- package/lib/core/parser.js +1162 -864
- package/lib/core/pattern.js +224 -75
- package/lib/core/pdf_manager.js +154 -285
- package/lib/core/primitives.js +145 -69
- package/lib/core/ps_parser.js +212 -162
- package/lib/core/standard_fonts.js +245 -244
- package/lib/core/stream.js +353 -81
- package/lib/core/type1_parser.js +218 -68
- package/lib/core/unicode.js +1682 -1655
- package/lib/core/worker.js +233 -302
- package/lib/core/worker_stream.js +168 -0
- package/lib/display/annotation_layer.js +808 -862
- package/lib/display/api.js +1778 -1462
- package/lib/display/api_compatibility.js +14 -9
- package/lib/display/canvas.js +463 -140
- package/lib/display/content_disposition.js +86 -58
- package/lib/display/display_utils.js +524 -0
- package/lib/display/fetch_stream.js +202 -274
- package/lib/display/font_loader.js +311 -333
- package/lib/display/metadata.js +98 -88
- package/lib/display/network.js +343 -347
- package/lib/display/network_utils.js +46 -26
- package/lib/display/node_stream.js +326 -404
- package/lib/display/pattern_helper.js +168 -69
- package/lib/display/svg.js +1296 -885
- package/lib/display/text_layer.js +229 -103
- package/lib/display/transport_stream.js +290 -250
- package/lib/display/webgl.js +116 -83
- package/lib/display/worker_options.js +6 -5
- package/lib/display/xml_parser.js +358 -337
- package/lib/examples/node/domstubs.js +95 -39
- package/lib/pdf.js +49 -31
- package/lib/pdf.worker.js +7 -5
- package/lib/shared/compatibility.js +3 -145
- package/lib/shared/is_node.js +8 -7
- package/lib/shared/message_handler.js +367 -314
- package/lib/shared/util.js +421 -415
- package/lib/test/unit/annotation_spec.js +1570 -690
- package/lib/test/unit/api_spec.js +855 -493
- package/lib/test/unit/bidi_spec.js +12 -12
- package/lib/test/unit/cff_parser_spec.js +88 -61
- package/lib/test/unit/clitests_helper.js +9 -12
- package/lib/test/unit/cmap_spec.js +140 -88
- package/lib/test/unit/colorspace_spec.js +204 -152
- package/lib/test/unit/core_utils_spec.js +211 -0
- package/lib/test/unit/crypto_spec.js +194 -182
- package/lib/test/unit/custom_spec.js +50 -64
- package/lib/test/unit/display_svg_spec.js +53 -38
- package/lib/test/unit/display_utils_spec.js +263 -0
- package/lib/test/unit/document_spec.js +17 -22
- package/lib/test/unit/encodings_spec.js +15 -57
- package/lib/test/unit/evaluator_spec.js +90 -83
- package/lib/test/unit/fetch_stream_spec.js +111 -0
- package/lib/test/unit/function_spec.js +219 -205
- package/lib/test/unit/jasmine-boot.js +68 -39
- package/lib/test/unit/message_handler_spec.js +187 -160
- package/lib/test/unit/metadata_spec.js +87 -34
- package/lib/test/unit/murmurhash3_spec.js +13 -13
- package/lib/test/unit/network_spec.js +26 -59
- package/lib/test/unit/network_utils_spec.js +187 -121
- package/lib/test/unit/node_stream_spec.js +98 -90
- package/lib/test/unit/parser_spec.js +173 -131
- package/lib/test/unit/pdf_find_controller_spec.js +148 -67
- package/lib/test/unit/pdf_find_utils_spec.js +35 -34
- package/lib/test/unit/pdf_history_spec.js +45 -33
- package/lib/test/unit/primitives_spec.js +161 -126
- package/lib/test/unit/stream_spec.js +22 -15
- package/lib/test/unit/test_utils.js +149 -98
- package/lib/test/unit/testreporter.js +36 -18
- package/lib/test/unit/type1_parser_spec.js +46 -44
- package/lib/test/unit/ui_utils_spec.js +388 -372
- package/lib/test/unit/unicode_spec.js +49 -46
- package/lib/test/unit/util_spec.js +144 -248
- package/lib/web/annotation_layer_builder.js +75 -95
- package/lib/web/app.js +1538 -1147
- package/lib/web/app_options.js +116 -104
- package/lib/web/base_viewer.js +950 -775
- package/lib/web/chromecom.js +217 -225
- package/lib/web/debugger.js +236 -148
- package/lib/web/download_manager.js +50 -50
- package/lib/web/firefox_print_service.js +51 -33
- package/lib/web/firefoxcom.js +225 -352
- package/lib/web/genericcom.js +30 -93
- package/lib/web/genericl10n.js +26 -143
- package/lib/web/grab_to_pan.js +57 -33
- package/lib/web/interfaces.js +105 -232
- package/lib/web/overlay_manager.js +73 -227
- package/lib/web/password_prompt.js +44 -62
- package/lib/web/pdf_attachment_viewer.js +118 -123
- package/lib/web/pdf_cursor_tools.js +89 -93
- package/lib/web/pdf_document_properties.js +242 -281
- package/lib/web/pdf_find_bar.js +157 -163
- package/lib/web/pdf_find_controller.js +598 -454
- package/lib/web/pdf_find_utils.js +32 -16
- package/lib/web/pdf_history.js +481 -355
- package/lib/web/pdf_link_service.js +355 -323
- package/lib/web/pdf_outline_viewer.js +167 -152
- package/lib/web/pdf_page_view.js +511 -457
- package/lib/web/pdf_presentation_mode.js +347 -335
- package/lib/web/pdf_print_service.js +133 -103
- package/lib/web/pdf_rendering_queue.js +98 -100
- package/lib/web/pdf_sidebar.js +323 -299
- package/lib/web/pdf_sidebar_resizer.js +107 -108
- package/lib/web/pdf_single_page_viewer.js +94 -146
- package/lib/web/pdf_thumbnail_view.js +319 -269
- package/lib/web/pdf_thumbnail_viewer.js +219 -199
- package/lib/web/pdf_viewer.component.js +111 -32
- package/lib/web/pdf_viewer.js +61 -101
- package/lib/web/preferences.js +87 -272
- package/lib/web/secondary_toolbar.js +207 -220
- package/lib/web/text_layer_builder.js +322 -322
- package/lib/web/toolbar.js +227 -180
- package/lib/web/ui_utils.js +476 -421
- package/lib/web/view_history.js +59 -208
- package/lib/web/viewer_compatibility.js +9 -6
- package/package.json +2 -9
- package/web/pdf_viewer.css +36 -22
- package/web/pdf_viewer.js +4407 -4516
- package/web/pdf_viewer.js.map +1 -1
- package/webpack.js +14 -5
- package/external/streams/streams-lib.js +0 -3962
- package/external/url/url-lib.js +0 -627
- package/lib/display/dom_utils.js +0 -441
- package/lib/shared/streams_polyfill.js +0 -39
- package/lib/shared/url_polyfill.js +0 -50
- package/lib/test/unit/dom_utils_spec.js +0 -89
- package/lib/web/dom_events.js +0 -140
package/lib/core/image.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @licstart The following is the entire license notice for the
|
3
3
|
* Javascript code in this page
|
4
4
|
*
|
5
|
-
* Copyright
|
5
|
+
* Copyright 2020 Mozilla Foundation
|
6
6
|
*
|
7
7
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
8
|
* you may not use this file except in compliance with the License.
|
@@ -19,44 +19,61 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
24
|
Object.defineProperty(exports, "__esModule", {
|
25
25
|
value: true
|
26
26
|
});
|
27
|
-
exports.PDFImage =
|
27
|
+
exports.PDFImage = void 0;
|
28
28
|
|
29
|
-
var
|
29
|
+
var _util = require("../shared/util.js");
|
30
30
|
|
31
|
-
var
|
31
|
+
var _primitives = require("./primitives.js");
|
32
32
|
|
33
|
-
var
|
33
|
+
var _colorspace = require("./colorspace.js");
|
34
34
|
|
35
|
-
var
|
35
|
+
var _stream = require("./stream.js");
|
36
36
|
|
37
|
-
var
|
37
|
+
var _jpeg_stream = require("./jpeg_stream.js");
|
38
38
|
|
39
|
-
var
|
40
|
-
|
41
|
-
var _jpx = require('./jpx');
|
39
|
+
var _jpx = require("./jpx.js");
|
42
40
|
|
43
41
|
var PDFImage = function PDFImageClosure() {
|
44
42
|
function handleImageData(image, nativeDecoder) {
|
45
43
|
if (nativeDecoder && nativeDecoder.canDecode(image)) {
|
46
|
-
return nativeDecoder.decode(image).catch(
|
47
|
-
(0, _util.warn)(
|
44
|
+
return nativeDecoder.decode(image).catch(reason => {
|
45
|
+
(0, _util.warn)("Native image decoding failed -- trying to recover: " + (reason && reason.message));
|
48
46
|
return image;
|
49
47
|
});
|
50
48
|
}
|
49
|
+
|
51
50
|
return Promise.resolve(image);
|
52
51
|
}
|
52
|
+
|
53
53
|
function decodeAndClamp(value, addend, coefficient, max) {
|
54
54
|
value = addend + value * coefficient;
|
55
|
-
|
55
|
+
|
56
|
+
if (value < 0) {
|
57
|
+
value = 0;
|
58
|
+
} else if (value > max) {
|
59
|
+
value = max;
|
60
|
+
}
|
61
|
+
|
62
|
+
return value;
|
56
63
|
}
|
64
|
+
|
57
65
|
function resizeImageMask(src, bpc, w1, h1, w2, h2) {
|
58
66
|
var length = w2 * h2;
|
59
|
-
|
67
|
+
let dest;
|
68
|
+
|
69
|
+
if (bpc <= 8) {
|
70
|
+
dest = new Uint8Array(length);
|
71
|
+
} else if (bpc <= 16) {
|
72
|
+
dest = new Uint16Array(length);
|
73
|
+
} else {
|
74
|
+
dest = new Uint32Array(length);
|
75
|
+
}
|
76
|
+
|
60
77
|
var xRatio = w1 / w2;
|
61
78
|
var yRatio = h1 / h2;
|
62
79
|
var i,
|
@@ -66,38 +83,40 @@ var PDFImage = function PDFImageClosure() {
|
|
66
83
|
oldIndex;
|
67
84
|
var xScaled = new Uint16Array(w2);
|
68
85
|
var w1Scanline = w1;
|
86
|
+
|
69
87
|
for (i = 0; i < w2; i++) {
|
70
88
|
xScaled[i] = Math.floor(i * xRatio);
|
71
89
|
}
|
90
|
+
|
72
91
|
for (i = 0; i < h2; i++) {
|
73
92
|
py = Math.floor(i * yRatio) * w1Scanline;
|
93
|
+
|
74
94
|
for (j = 0; j < w2; j++) {
|
75
95
|
oldIndex = py + xScaled[j];
|
76
96
|
dest[newIndex++] = src[oldIndex];
|
77
97
|
}
|
78
98
|
}
|
99
|
+
|
79
100
|
return dest;
|
80
101
|
}
|
81
|
-
function PDFImage(_ref) {
|
82
|
-
var xref = _ref.xref,
|
83
|
-
res = _ref.res,
|
84
|
-
image = _ref.image,
|
85
|
-
_ref$isInline = _ref.isInline,
|
86
|
-
isInline = _ref$isInline === undefined ? false : _ref$isInline,
|
87
|
-
_ref$smask = _ref.smask,
|
88
|
-
smask = _ref$smask === undefined ? null : _ref$smask,
|
89
|
-
_ref$mask = _ref.mask,
|
90
|
-
mask = _ref$mask === undefined ? null : _ref$mask,
|
91
|
-
_ref$isMask = _ref.isMask,
|
92
|
-
isMask = _ref$isMask === undefined ? false : _ref$isMask,
|
93
|
-
pdfFunctionFactory = _ref.pdfFunctionFactory;
|
94
102
|
|
103
|
+
function PDFImage({
|
104
|
+
xref,
|
105
|
+
res,
|
106
|
+
image,
|
107
|
+
isInline = false,
|
108
|
+
smask = null,
|
109
|
+
mask = null,
|
110
|
+
isMask = false,
|
111
|
+
pdfFunctionFactory
|
112
|
+
}) {
|
95
113
|
this.image = image;
|
96
114
|
var dict = image.dict;
|
97
|
-
|
115
|
+
const filter = dict.get("Filter");
|
116
|
+
|
98
117
|
if ((0, _primitives.isName)(filter)) {
|
99
118
|
switch (filter.name) {
|
100
|
-
case
|
119
|
+
case "JPXDecode":
|
101
120
|
var jpxImage = new _jpx.JpxImage();
|
102
121
|
jpxImage.parseImageProperties(image.stream);
|
103
122
|
image.stream.reset();
|
@@ -106,97 +125,118 @@ var PDFImage = function PDFImageClosure() {
|
|
106
125
|
image.bitsPerComponent = jpxImage.bitsPerComponent;
|
107
126
|
image.numComps = jpxImage.componentsCount;
|
108
127
|
break;
|
109
|
-
|
128
|
+
|
129
|
+
case "JBIG2Decode":
|
110
130
|
image.bitsPerComponent = 1;
|
111
131
|
image.numComps = 1;
|
112
132
|
break;
|
113
133
|
}
|
114
134
|
}
|
115
|
-
|
116
|
-
|
135
|
+
|
136
|
+
let width = dict.get("Width", "W");
|
137
|
+
let height = dict.get("Height", "H");
|
138
|
+
|
117
139
|
if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
|
118
|
-
(0, _util.warn)(
|
140
|
+
(0, _util.warn)("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary.");
|
119
141
|
width = image.width;
|
120
142
|
height = image.height;
|
121
143
|
}
|
144
|
+
|
122
145
|
if (width < 1 || height < 1) {
|
123
|
-
throw new _util.FormatError(
|
146
|
+
throw new _util.FormatError(`Invalid image width: ${width} or height: ${height}`);
|
124
147
|
}
|
148
|
+
|
125
149
|
this.width = width;
|
126
150
|
this.height = height;
|
127
|
-
this.interpolate = dict.get(
|
128
|
-
this.imageMask = dict.get(
|
129
|
-
this.matte = dict.get(
|
151
|
+
this.interpolate = dict.get("Interpolate", "I") || false;
|
152
|
+
this.imageMask = dict.get("ImageMask", "IM") || false;
|
153
|
+
this.matte = dict.get("Matte") || false;
|
130
154
|
var bitsPerComponent = image.bitsPerComponent;
|
155
|
+
|
131
156
|
if (!bitsPerComponent) {
|
132
|
-
bitsPerComponent = dict.get(
|
157
|
+
bitsPerComponent = dict.get("BitsPerComponent", "BPC");
|
158
|
+
|
133
159
|
if (!bitsPerComponent) {
|
134
160
|
if (this.imageMask) {
|
135
161
|
bitsPerComponent = 1;
|
136
162
|
} else {
|
137
|
-
throw new _util.FormatError(
|
163
|
+
throw new _util.FormatError(`Bits per component missing in image: ${this.imageMask}`);
|
138
164
|
}
|
139
165
|
}
|
140
166
|
}
|
167
|
+
|
141
168
|
this.bpc = bitsPerComponent;
|
169
|
+
|
142
170
|
if (!this.imageMask) {
|
143
|
-
var colorSpace = dict.get(
|
171
|
+
var colorSpace = dict.get("ColorSpace", "CS");
|
172
|
+
|
144
173
|
if (!colorSpace) {
|
145
|
-
(0, _util.info)(
|
174
|
+
(0, _util.info)("JPX images (which do not require color spaces)");
|
175
|
+
|
146
176
|
switch (image.numComps) {
|
147
177
|
case 1:
|
148
|
-
colorSpace = _primitives.Name.get(
|
178
|
+
colorSpace = _primitives.Name.get("DeviceGray");
|
149
179
|
break;
|
180
|
+
|
150
181
|
case 3:
|
151
|
-
colorSpace = _primitives.Name.get(
|
182
|
+
colorSpace = _primitives.Name.get("DeviceRGB");
|
152
183
|
break;
|
184
|
+
|
153
185
|
case 4:
|
154
|
-
colorSpace = _primitives.Name.get(
|
186
|
+
colorSpace = _primitives.Name.get("DeviceCMYK");
|
155
187
|
break;
|
188
|
+
|
156
189
|
default:
|
157
|
-
throw new Error(
|
190
|
+
throw new Error(`JPX images with ${image.numComps} ` + "color components not supported.");
|
158
191
|
}
|
159
192
|
}
|
160
|
-
|
193
|
+
|
194
|
+
const resources = isInline ? res : null;
|
161
195
|
this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, resources, pdfFunctionFactory);
|
162
196
|
this.numComps = this.colorSpace.numComps;
|
163
197
|
}
|
164
|
-
|
198
|
+
|
199
|
+
this.decode = dict.getArray("Decode", "D");
|
165
200
|
this.needsDecode = false;
|
166
|
-
|
201
|
+
|
202
|
+
if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
|
167
203
|
this.needsDecode = true;
|
168
204
|
var max = (1 << bitsPerComponent) - 1;
|
169
205
|
this.decodeCoefficients = [];
|
170
206
|
this.decodeAddends = [];
|
207
|
+
const isIndexed = this.colorSpace && this.colorSpace.name === "Indexed";
|
208
|
+
|
171
209
|
for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
|
172
210
|
var dmin = this.decode[i];
|
173
211
|
var dmax = this.decode[i + 1];
|
174
|
-
this.decodeCoefficients[j] = dmax - dmin;
|
175
|
-
this.decodeAddends[j] = max * dmin;
|
212
|
+
this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
|
213
|
+
this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
|
176
214
|
}
|
177
215
|
}
|
216
|
+
|
178
217
|
if (smask) {
|
179
218
|
this.smask = new PDFImage({
|
180
|
-
xref
|
181
|
-
res
|
219
|
+
xref,
|
220
|
+
res,
|
182
221
|
image: smask,
|
183
|
-
isInline
|
184
|
-
pdfFunctionFactory
|
222
|
+
isInline,
|
223
|
+
pdfFunctionFactory
|
185
224
|
});
|
186
225
|
} else if (mask) {
|
187
226
|
if ((0, _primitives.isStream)(mask)) {
|
188
227
|
var maskDict = mask.dict,
|
189
|
-
imageMask = maskDict.get(
|
228
|
+
imageMask = maskDict.get("ImageMask", "IM");
|
229
|
+
|
190
230
|
if (!imageMask) {
|
191
|
-
(0, _util.warn)(
|
231
|
+
(0, _util.warn)("Ignoring /Mask in image without /ImageMask.");
|
192
232
|
} else {
|
193
233
|
this.mask = new PDFImage({
|
194
|
-
xref
|
195
|
-
res
|
234
|
+
xref,
|
235
|
+
res,
|
196
236
|
image: mask,
|
197
|
-
isInline
|
237
|
+
isInline,
|
198
238
|
isMask: true,
|
199
|
-
pdfFunctionFactory
|
239
|
+
pdfFunctionFactory
|
200
240
|
});
|
201
241
|
}
|
202
242
|
} else {
|
@@ -204,68 +244,67 @@ var PDFImage = function PDFImageClosure() {
|
|
204
244
|
}
|
205
245
|
}
|
206
246
|
}
|
207
|
-
PDFImage.buildImage = function (_ref2) {
|
208
|
-
var handler = _ref2.handler,
|
209
|
-
xref = _ref2.xref,
|
210
|
-
res = _ref2.res,
|
211
|
-
image = _ref2.image,
|
212
|
-
_ref2$isInline = _ref2.isInline,
|
213
|
-
isInline = _ref2$isInline === undefined ? false : _ref2$isInline,
|
214
|
-
_ref2$nativeDecoder = _ref2.nativeDecoder,
|
215
|
-
nativeDecoder = _ref2$nativeDecoder === undefined ? null : _ref2$nativeDecoder,
|
216
|
-
pdfFunctionFactory = _ref2.pdfFunctionFactory;
|
217
247
|
|
248
|
+
PDFImage.buildImage = function ({
|
249
|
+
handler,
|
250
|
+
xref,
|
251
|
+
res,
|
252
|
+
image,
|
253
|
+
isInline = false,
|
254
|
+
nativeDecoder = null,
|
255
|
+
pdfFunctionFactory
|
256
|
+
}) {
|
218
257
|
var imagePromise = handleImageData(image, nativeDecoder);
|
219
258
|
var smaskPromise;
|
220
259
|
var maskPromise;
|
221
|
-
var smask = image.dict.get(
|
222
|
-
var mask = image.dict.get(
|
260
|
+
var smask = image.dict.get("SMask");
|
261
|
+
var mask = image.dict.get("Mask");
|
262
|
+
|
223
263
|
if (smask) {
|
224
264
|
smaskPromise = handleImageData(smask, nativeDecoder);
|
225
265
|
maskPromise = Promise.resolve(null);
|
226
266
|
} else {
|
227
267
|
smaskPromise = Promise.resolve(null);
|
268
|
+
|
228
269
|
if (mask) {
|
229
270
|
if ((0, _primitives.isStream)(mask)) {
|
230
271
|
maskPromise = handleImageData(mask, nativeDecoder);
|
231
272
|
} else if (Array.isArray(mask)) {
|
232
273
|
maskPromise = Promise.resolve(mask);
|
233
274
|
} else {
|
234
|
-
(0, _util.warn)(
|
275
|
+
(0, _util.warn)("Unsupported mask format.");
|
235
276
|
maskPromise = Promise.resolve(null);
|
236
277
|
}
|
237
278
|
} else {
|
238
279
|
maskPromise = Promise.resolve(null);
|
239
280
|
}
|
240
281
|
}
|
241
|
-
return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (_ref3) {
|
242
|
-
var _ref4 = _slicedToArray(_ref3, 3),
|
243
|
-
imageData = _ref4[0],
|
244
|
-
smaskData = _ref4[1],
|
245
|
-
maskData = _ref4[2];
|
246
282
|
|
283
|
+
return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function ([imageData, smaskData, maskData]) {
|
247
284
|
return new PDFImage({
|
248
|
-
xref
|
249
|
-
res
|
285
|
+
xref,
|
286
|
+
res,
|
250
287
|
image: imageData,
|
251
|
-
isInline
|
288
|
+
isInline,
|
252
289
|
smask: smaskData,
|
253
290
|
mask: maskData,
|
254
|
-
pdfFunctionFactory
|
291
|
+
pdfFunctionFactory
|
255
292
|
});
|
256
293
|
});
|
257
294
|
};
|
258
|
-
PDFImage.createMask = function (_ref5) {
|
259
|
-
var imgArray = _ref5.imgArray,
|
260
|
-
width = _ref5.width,
|
261
|
-
height = _ref5.height,
|
262
|
-
imageIsFromDecodeStream = _ref5.imageIsFromDecodeStream,
|
263
|
-
inverseDecode = _ref5.inverseDecode;
|
264
295
|
|
296
|
+
PDFImage.createMask = function ({
|
297
|
+
imgArray,
|
298
|
+
width,
|
299
|
+
height,
|
300
|
+
imageIsFromDecodeStream,
|
301
|
+
inverseDecode
|
302
|
+
}) {
|
265
303
|
var computedLength = (width + 7 >> 3) * height;
|
266
304
|
var actualLength = imgArray.byteLength;
|
267
305
|
var haveFullData = computedLength === actualLength;
|
268
306
|
var data, i;
|
307
|
+
|
269
308
|
if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
|
270
309
|
data = imgArray;
|
271
310
|
} else if (!inverseDecode) {
|
@@ -274,42 +313,52 @@ var PDFImage = function PDFImageClosure() {
|
|
274
313
|
} else {
|
275
314
|
data = new Uint8ClampedArray(computedLength);
|
276
315
|
data.set(imgArray);
|
316
|
+
|
277
317
|
for (i = actualLength; i < computedLength; i++) {
|
278
318
|
data[i] = 0xff;
|
279
319
|
}
|
280
320
|
}
|
321
|
+
|
281
322
|
if (inverseDecode) {
|
282
323
|
for (i = 0; i < actualLength; i++) {
|
283
|
-
data[i] ^=
|
324
|
+
data[i] ^= 0xff;
|
284
325
|
}
|
285
326
|
}
|
327
|
+
|
286
328
|
return {
|
287
|
-
data
|
288
|
-
width
|
289
|
-
height
|
329
|
+
data,
|
330
|
+
width,
|
331
|
+
height
|
290
332
|
};
|
291
333
|
};
|
334
|
+
|
292
335
|
PDFImage.prototype = {
|
293
336
|
get drawWidth() {
|
294
337
|
return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
|
295
338
|
},
|
339
|
+
|
296
340
|
get drawHeight() {
|
297
341
|
return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
|
298
342
|
},
|
299
|
-
|
343
|
+
|
344
|
+
decodeBuffer(buffer) {
|
300
345
|
var bpc = this.bpc;
|
301
346
|
var numComps = this.numComps;
|
302
347
|
var decodeAddends = this.decodeAddends;
|
303
348
|
var decodeCoefficients = this.decodeCoefficients;
|
304
349
|
var max = (1 << bpc) - 1;
|
305
350
|
var i, ii;
|
351
|
+
|
306
352
|
if (bpc === 1) {
|
307
353
|
for (i = 0, ii = buffer.length; i < ii; i++) {
|
308
354
|
buffer[i] = +!buffer[i];
|
309
355
|
}
|
356
|
+
|
310
357
|
return;
|
311
358
|
}
|
359
|
+
|
312
360
|
var index = 0;
|
361
|
+
|
313
362
|
for (i = 0, ii = this.width * this.height; i < ii; i++) {
|
314
363
|
for (var j = 0; j < numComps; j++) {
|
315
364
|
buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
|
@@ -317,27 +366,42 @@ var PDFImage = function PDFImageClosure() {
|
|
317
366
|
}
|
318
367
|
}
|
319
368
|
},
|
320
|
-
|
369
|
+
|
370
|
+
getComponents(buffer) {
|
321
371
|
var bpc = this.bpc;
|
372
|
+
|
322
373
|
if (bpc === 8) {
|
323
374
|
return buffer;
|
324
375
|
}
|
376
|
+
|
325
377
|
var width = this.width;
|
326
378
|
var height = this.height;
|
327
379
|
var numComps = this.numComps;
|
328
380
|
var length = width * height * numComps;
|
329
381
|
var bufferPos = 0;
|
330
|
-
|
382
|
+
let output;
|
383
|
+
|
384
|
+
if (bpc <= 8) {
|
385
|
+
output = new Uint8Array(length);
|
386
|
+
} else if (bpc <= 16) {
|
387
|
+
output = new Uint16Array(length);
|
388
|
+
} else {
|
389
|
+
output = new Uint32Array(length);
|
390
|
+
}
|
391
|
+
|
331
392
|
var rowComps = width * numComps;
|
332
393
|
var max = (1 << bpc) - 1;
|
333
394
|
var i = 0,
|
334
395
|
ii,
|
335
396
|
buf;
|
397
|
+
|
336
398
|
if (bpc === 1) {
|
337
399
|
var mask, loop1End, loop2End;
|
400
|
+
|
338
401
|
for (var j = 0; j < height; j++) {
|
339
402
|
loop1End = i + (rowComps & ~7);
|
340
403
|
loop2End = i + rowComps;
|
404
|
+
|
341
405
|
while (i < loop1End) {
|
342
406
|
buf = buffer[bufferPos++];
|
343
407
|
output[i] = buf >> 7 & 1;
|
@@ -350,9 +414,11 @@ var PDFImage = function PDFImageClosure() {
|
|
350
414
|
output[i + 7] = buf & 1;
|
351
415
|
i += 8;
|
352
416
|
}
|
417
|
+
|
353
418
|
if (i < loop2End) {
|
354
419
|
buf = buffer[bufferPos++];
|
355
420
|
mask = 128;
|
421
|
+
|
356
422
|
while (i < loop2End) {
|
357
423
|
output[i++] = +!!(buf & mask);
|
358
424
|
mask >>= 1;
|
@@ -362,33 +428,47 @@ var PDFImage = function PDFImageClosure() {
|
|
362
428
|
} else {
|
363
429
|
var bits = 0;
|
364
430
|
buf = 0;
|
431
|
+
|
365
432
|
for (i = 0, ii = length; i < ii; ++i) {
|
366
433
|
if (i % rowComps === 0) {
|
367
434
|
buf = 0;
|
368
435
|
bits = 0;
|
369
436
|
}
|
437
|
+
|
370
438
|
while (bits < bpc) {
|
371
439
|
buf = buf << 8 | buffer[bufferPos++];
|
372
440
|
bits += 8;
|
373
441
|
}
|
442
|
+
|
374
443
|
var remainingBits = bits - bpc;
|
375
|
-
|
376
|
-
|
444
|
+
let value = buf >> remainingBits;
|
445
|
+
|
446
|
+
if (value < 0) {
|
447
|
+
value = 0;
|
448
|
+
} else if (value > max) {
|
449
|
+
value = max;
|
450
|
+
}
|
451
|
+
|
452
|
+
output[i] = value;
|
377
453
|
buf = buf & (1 << remainingBits) - 1;
|
378
454
|
bits = remainingBits;
|
379
455
|
}
|
380
456
|
}
|
457
|
+
|
381
458
|
return output;
|
382
459
|
},
|
383
|
-
|
460
|
+
|
461
|
+
fillOpacity(rgbaBuf, width, height, actualHeight, image) {
|
384
462
|
var smask = this.smask;
|
385
463
|
var mask = this.mask;
|
386
464
|
var alphaBuf, sw, sh, i, ii, j;
|
465
|
+
|
387
466
|
if (smask) {
|
388
467
|
sw = smask.width;
|
389
468
|
sh = smask.height;
|
390
469
|
alphaBuf = new Uint8ClampedArray(sw * sh);
|
391
470
|
smask.fillGrayBuffer(alphaBuf);
|
471
|
+
|
392
472
|
if (sw !== width || sh !== height) {
|
393
473
|
alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
|
394
474
|
}
|
@@ -399,32 +479,39 @@ var PDFImage = function PDFImageClosure() {
|
|
399
479
|
alphaBuf = new Uint8ClampedArray(sw * sh);
|
400
480
|
mask.numComps = 1;
|
401
481
|
mask.fillGrayBuffer(alphaBuf);
|
482
|
+
|
402
483
|
for (i = 0, ii = sw * sh; i < ii; ++i) {
|
403
484
|
alphaBuf[i] = 255 - alphaBuf[i];
|
404
485
|
}
|
486
|
+
|
405
487
|
if (sw !== width || sh !== height) {
|
406
488
|
alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
|
407
489
|
}
|
408
490
|
} else if (Array.isArray(mask)) {
|
409
491
|
alphaBuf = new Uint8ClampedArray(width * height);
|
410
492
|
var numComps = this.numComps;
|
493
|
+
|
411
494
|
for (i = 0, ii = width * height; i < ii; ++i) {
|
412
495
|
var opacity = 0;
|
413
496
|
var imageOffset = i * numComps;
|
497
|
+
|
414
498
|
for (j = 0; j < numComps; ++j) {
|
415
499
|
var color = image[imageOffset + j];
|
416
500
|
var maskOffset = j * 2;
|
501
|
+
|
417
502
|
if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
|
418
503
|
opacity = 255;
|
419
504
|
break;
|
420
505
|
}
|
421
506
|
}
|
507
|
+
|
422
508
|
alphaBuf[i] = opacity;
|
423
509
|
}
|
424
510
|
} else {
|
425
|
-
throw new _util.FormatError(
|
511
|
+
throw new _util.FormatError("Unknown mask format.");
|
426
512
|
}
|
427
513
|
}
|
514
|
+
|
428
515
|
if (alphaBuf) {
|
429
516
|
for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
|
430
517
|
rgbaBuf[j] = alphaBuf[i];
|
@@ -435,33 +522,38 @@ var PDFImage = function PDFImageClosure() {
|
|
435
522
|
}
|
436
523
|
}
|
437
524
|
},
|
438
|
-
|
525
|
+
|
526
|
+
undoPreblend(buffer, width, height) {
|
439
527
|
var matte = this.smask && this.smask.matte;
|
528
|
+
|
440
529
|
if (!matte) {
|
441
530
|
return;
|
442
531
|
}
|
532
|
+
|
443
533
|
var matteRgb = this.colorSpace.getRgb(matte, 0);
|
444
534
|
var matteR = matteRgb[0];
|
445
535
|
var matteG = matteRgb[1];
|
446
536
|
var matteB = matteRgb[2];
|
447
537
|
var length = width * height * 4;
|
538
|
+
|
448
539
|
for (var i = 0; i < length; i += 4) {
|
449
540
|
var alpha = buffer[i + 3];
|
541
|
+
|
450
542
|
if (alpha === 0) {
|
451
543
|
buffer[i] = 255;
|
452
544
|
buffer[i + 1] = 255;
|
453
545
|
buffer[i + 2] = 255;
|
454
546
|
continue;
|
455
547
|
}
|
548
|
+
|
456
549
|
var k = 255 / alpha;
|
457
550
|
buffer[i] = (buffer[i] - matteR) * k + matteR;
|
458
551
|
buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
|
459
552
|
buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
|
460
553
|
}
|
461
554
|
},
|
462
|
-
createImageData: function createImageData() {
|
463
|
-
var forceRGBA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
464
555
|
|
556
|
+
createImageData(forceRGBA = false) {
|
465
557
|
var drawWidth = this.drawWidth;
|
466
558
|
var drawHeight = this.drawHeight;
|
467
559
|
var imgData = {
|
@@ -476,16 +568,20 @@ var PDFImage = function PDFImageClosure() {
|
|
476
568
|
var bpc = this.bpc;
|
477
569
|
var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
|
478
570
|
var imgArray;
|
571
|
+
|
479
572
|
if (!forceRGBA) {
|
480
573
|
var kind;
|
481
|
-
|
574
|
+
|
575
|
+
if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
|
482
576
|
kind = _util.ImageKind.GRAYSCALE_1BPP;
|
483
|
-
} else if (this.colorSpace.name ===
|
577
|
+
} else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
|
484
578
|
kind = _util.ImageKind.RGB_24BPP;
|
485
579
|
}
|
580
|
+
|
486
581
|
if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
|
487
582
|
imgData.kind = kind;
|
488
583
|
imgArray = this.getImageBytes(originalHeight * rowBytes);
|
584
|
+
|
489
585
|
if (this.image instanceof _stream.DecodeStream) {
|
490
586
|
imgData.data = imgArray;
|
491
587
|
} else {
|
@@ -493,32 +589,40 @@ var PDFImage = function PDFImageClosure() {
|
|
493
589
|
newArray.set(imgArray);
|
494
590
|
imgData.data = newArray;
|
495
591
|
}
|
592
|
+
|
496
593
|
if (this.needsDecode) {
|
497
|
-
(0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP,
|
594
|
+
(0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale.");
|
498
595
|
var buffer = imgData.data;
|
596
|
+
|
499
597
|
for (var i = 0, ii = buffer.length; i < ii; i++) {
|
500
598
|
buffer[i] ^= 0xff;
|
501
599
|
}
|
502
600
|
}
|
601
|
+
|
503
602
|
return imgData;
|
504
603
|
}
|
604
|
+
|
505
605
|
if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
|
506
|
-
|
606
|
+
let imageLength = originalHeight * rowBytes;
|
607
|
+
|
507
608
|
switch (this.colorSpace.name) {
|
508
|
-
case
|
609
|
+
case "DeviceGray":
|
509
610
|
imageLength *= 3;
|
510
|
-
|
511
|
-
case
|
611
|
+
|
612
|
+
case "DeviceRGB":
|
613
|
+
case "DeviceCMYK":
|
512
614
|
imgData.kind = _util.ImageKind.RGB_24BPP;
|
513
615
|
imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
|
514
616
|
return imgData;
|
515
617
|
}
|
516
618
|
}
|
517
619
|
}
|
620
|
+
|
518
621
|
imgArray = this.getImageBytes(originalHeight * rowBytes);
|
519
622
|
var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
|
520
623
|
var comps = this.getComponents(imgArray);
|
521
624
|
var alpha01, maybeUndoPreblend;
|
625
|
+
|
522
626
|
if (!forceRGBA && !this.smask && !this.mask) {
|
523
627
|
imgData.kind = _util.ImageKind.RGB_24BPP;
|
524
628
|
imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
|
@@ -531,20 +635,27 @@ var PDFImage = function PDFImageClosure() {
|
|
531
635
|
maybeUndoPreblend = true;
|
532
636
|
this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
|
533
637
|
}
|
638
|
+
|
534
639
|
if (this.needsDecode) {
|
535
640
|
this.decodeBuffer(comps);
|
536
641
|
}
|
642
|
+
|
537
643
|
this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
|
644
|
+
|
538
645
|
if (maybeUndoPreblend) {
|
539
646
|
this.undoPreblend(imgData.data, drawWidth, actualHeight);
|
540
647
|
}
|
648
|
+
|
541
649
|
return imgData;
|
542
650
|
},
|
543
|
-
|
651
|
+
|
652
|
+
fillGrayBuffer(buffer) {
|
544
653
|
var numComps = this.numComps;
|
654
|
+
|
545
655
|
if (numComps !== 1) {
|
546
|
-
throw new _util.FormatError(
|
656
|
+
throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`);
|
547
657
|
}
|
658
|
+
|
548
659
|
var width = this.width;
|
549
660
|
var height = this.height;
|
550
661
|
var bpc = this.bpc;
|
@@ -552,8 +663,10 @@ var PDFImage = function PDFImageClosure() {
|
|
552
663
|
var imgArray = this.getImageBytes(height * rowBytes);
|
553
664
|
var comps = this.getComponents(imgArray);
|
554
665
|
var i, length;
|
666
|
+
|
555
667
|
if (bpc === 1) {
|
556
668
|
length = width * height;
|
669
|
+
|
557
670
|
if (this.needsDecode) {
|
558
671
|
for (i = 0; i < length; ++i) {
|
559
672
|
buffer[i] = comps[i] - 1 & 255;
|
@@ -563,27 +676,32 @@ var PDFImage = function PDFImageClosure() {
|
|
563
676
|
buffer[i] = -comps[i] & 255;
|
564
677
|
}
|
565
678
|
}
|
679
|
+
|
566
680
|
return;
|
567
681
|
}
|
682
|
+
|
568
683
|
if (this.needsDecode) {
|
569
684
|
this.decodeBuffer(comps);
|
570
685
|
}
|
686
|
+
|
571
687
|
length = width * height;
|
572
688
|
var scale = 255 / ((1 << bpc) - 1);
|
689
|
+
|
573
690
|
for (i = 0; i < length; ++i) {
|
574
691
|
buffer[i] = scale * comps[i];
|
575
692
|
}
|
576
693
|
},
|
577
|
-
getImageBytes: function getImageBytes(length, drawWidth, drawHeight) {
|
578
|
-
var forceRGB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
579
694
|
|
695
|
+
getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {
|
580
696
|
this.image.reset();
|
581
697
|
this.image.drawWidth = drawWidth || this.width;
|
582
698
|
this.image.drawHeight = drawHeight || this.height;
|
583
699
|
this.image.forceRGB = !!forceRGB;
|
584
700
|
return this.image.getBytes(length, true);
|
585
701
|
}
|
702
|
+
|
586
703
|
};
|
587
704
|
return PDFImage;
|
588
705
|
}();
|
706
|
+
|
589
707
|
exports.PDFImage = PDFImage;
|