@file-viewer/renderer-ofd 2.1.7 → 2.1.8
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@file-viewer/renderer-ofd",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Standalone OFD renderer plugin for Flyfish File Viewer powered by DLTech21/ofd.js.",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"LICENSE"
|
|
54
54
|
],
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@file-viewer/core": "^2.1.
|
|
56
|
+
"@file-viewer/core": "^2.1.8",
|
|
57
57
|
"jszip": "^3.10.1",
|
|
58
58
|
"ofd-xml-parser": "^0.0.6"
|
|
59
59
|
},
|
|
@@ -32,6 +32,40 @@ const ensureBrowserGlobal = () => {
|
|
|
32
32
|
globalThis.xmlParseFlag = 0;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
const asArray = function (value) {
|
|
36
|
+
if (!value) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
return Array.isArray(value) ? value : [value];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const collectGroupedItems = function (groupOrGroups, childKey) {
|
|
43
|
+
let items = [];
|
|
44
|
+
for (const group of asArray(groupOrGroups)) {
|
|
45
|
+
if (group) {
|
|
46
|
+
items = items.concat(asArray(group[childKey]));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return items;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const getImageMime = function (format) {
|
|
53
|
+
const normalized = format ? format.toLowerCase() : '';
|
|
54
|
+
if (normalized === 'jpg' || normalized === 'jpeg') {
|
|
55
|
+
return 'image/jpeg';
|
|
56
|
+
}
|
|
57
|
+
if (normalized === 'gif') {
|
|
58
|
+
return 'image/gif';
|
|
59
|
+
}
|
|
60
|
+
if (normalized === 'bmp') {
|
|
61
|
+
return 'image/bmp';
|
|
62
|
+
}
|
|
63
|
+
if (normalized === 'webp') {
|
|
64
|
+
return 'image/webp';
|
|
65
|
+
}
|
|
66
|
+
return 'image/png';
|
|
67
|
+
}
|
|
68
|
+
|
|
35
69
|
export const unzipOfd = function (file) {
|
|
36
70
|
return new Promise((resolve, reject) => {
|
|
37
71
|
JsZip.loadAsync(file)
|
|
@@ -257,8 +291,7 @@ const getFont = async function (res) {
|
|
|
257
291
|
const fonts = res['ofd:Fonts'];
|
|
258
292
|
let fontResObj = {};
|
|
259
293
|
if (fonts) {
|
|
260
|
-
let fontArray =
|
|
261
|
-
fontArray = fontArray.concat(fonts['ofd:Font']);
|
|
294
|
+
let fontArray = collectGroupedItems(fonts, 'ofd:Font');
|
|
262
295
|
for (const font of fontArray) {
|
|
263
296
|
if (font) {
|
|
264
297
|
if (font['@_FamilyName']) {
|
|
@@ -276,8 +309,7 @@ const getDrawParam = async function (res) {
|
|
|
276
309
|
const drawParams = res['ofd:DrawParams'];
|
|
277
310
|
let drawParamResObj = {};
|
|
278
311
|
if (drawParams) {
|
|
279
|
-
let array =
|
|
280
|
-
array = array.concat(drawParams['ofd:DrawParam']);
|
|
312
|
+
let array = collectGroupedItems(drawParams, 'ofd:DrawParam');
|
|
281
313
|
for (const item of array) {
|
|
282
314
|
if (item) {
|
|
283
315
|
drawParamResObj[item['@_ID']] = {
|
|
@@ -296,10 +328,9 @@ const getMultiMediaRes = async function (zip, res, doc) {
|
|
|
296
328
|
const multiMedias = res['ofd:MultiMedias'];
|
|
297
329
|
let multiMediaResObj = {};
|
|
298
330
|
if (multiMedias) {
|
|
299
|
-
let array =
|
|
300
|
-
array = array.concat(multiMedias['ofd:MultiMedia']);
|
|
331
|
+
let array = collectGroupedItems(multiMedias, 'ofd:MultiMedia');
|
|
301
332
|
for (const item of array) {
|
|
302
|
-
if (item) {
|
|
333
|
+
if (item && item['ofd:MediaFile']) {
|
|
303
334
|
let file = item['ofd:MediaFile'];
|
|
304
335
|
if (res['@_BaseLoc']) {
|
|
305
336
|
if (file.indexOf(res['@_BaseLoc']) === -1) {
|
|
@@ -309,15 +340,17 @@ const getMultiMediaRes = async function (zip, res, doc) {
|
|
|
309
340
|
if (file.indexOf(doc) === -1) {
|
|
310
341
|
file = `${doc}/${file}`
|
|
311
342
|
}
|
|
312
|
-
|
|
343
|
+
const type = item['@_Type'] ? item['@_Type'].toLowerCase() : '';
|
|
344
|
+
if (type === 'image') {
|
|
313
345
|
const format = item['@_Format'];
|
|
314
346
|
const ext = getExtensionByPath(file);
|
|
315
347
|
if ((format && (format.toLowerCase() === 'gbig2' || format.toLowerCase() === 'jb2')) || ext && (ext.toLowerCase() === 'jb2' || ext.toLowerCase() === 'gbig2')) {
|
|
316
348
|
const jbig2 = await parseJbig2ImageFromZip(zip, file);
|
|
317
349
|
multiMediaResObj[item['@_ID']] = jbig2;
|
|
318
350
|
} else {
|
|
319
|
-
const
|
|
320
|
-
|
|
351
|
+
const imageFormat = format || ext || 'png';
|
|
352
|
+
const img = await parseOtherImageFromZip(zip, file, getImageMime(imageFormat));
|
|
353
|
+
multiMediaResObj[item['@_ID']] = {img, 'format': imageFormat.toLowerCase()};
|
|
321
354
|
}
|
|
322
355
|
} else {
|
|
323
356
|
multiMediaResObj[item['@_ID']] = file;
|
|
@@ -383,10 +416,10 @@ const parseJbig2ImageFromZip = async function (zip, name) {
|
|
|
383
416
|
});
|
|
384
417
|
}
|
|
385
418
|
|
|
386
|
-
const parseOtherImageFromZip = async function (zip, name) {
|
|
419
|
+
const parseOtherImageFromZip = async function (zip, name, mime = 'image/png') {
|
|
387
420
|
return new Promise((resolve, reject) => {
|
|
388
421
|
zip.files[name].async('base64').then(function (bytes) {
|
|
389
|
-
const img =
|
|
422
|
+
const img = `data:${mime};base64,` + bytes;
|
|
390
423
|
resolve(img);
|
|
391
424
|
}, function error(e) {
|
|
392
425
|
reject(e);
|
|
@@ -295,16 +295,26 @@ export const renderImageObject = function (pageWidth, pageHeight, multiMediaResO
|
|
|
295
295
|
let boundary = parseStBox(imageObject['@_Boundary']);
|
|
296
296
|
boundary = converterBox(boundary);
|
|
297
297
|
const resId = imageObject['@_ResourceID'];
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
298
|
+
const imageResource = multiMediaResObj ? multiMediaResObj[resId] : null;
|
|
299
|
+
if (!imageResource || typeof imageResource !== 'object') {
|
|
300
|
+
return renderMissingImageObject(boundary, imageObject['pfIndex']);
|
|
301
|
+
}
|
|
302
|
+
if (imageResource.format === 'gbig2') {
|
|
303
|
+
const img = imageResource.img;
|
|
304
|
+
const width = imageResource.width;
|
|
305
|
+
const height = imageResource.height;
|
|
302
306
|
return renderImageOnCanvas(img, width, height, boundary, imageObject['pfIndex']);
|
|
303
307
|
} else {
|
|
304
|
-
return renderImageOnDiv(pageWidth, pageHeight,
|
|
308
|
+
return renderImageOnDiv(pageWidth, pageHeight, imageResource.img, boundary, false, false, null, null, imageObject['pfIndex']);
|
|
305
309
|
}
|
|
306
310
|
}
|
|
307
311
|
|
|
312
|
+
const renderMissingImageObject = function (boundary, oid){
|
|
313
|
+
let div = document.createElement('div');
|
|
314
|
+
div.setAttribute('style', `overflow: hidden; position: absolute; left: ${boundary.x}px; top: ${boundary.y}px; width: ${boundary.w}px; height: ${boundary.h}px;z-index: ${oid}`)
|
|
315
|
+
return div;
|
|
316
|
+
}
|
|
317
|
+
|
|
308
318
|
const renderImageOnCanvas = function (img, imgWidth, imgHeight, boundary, oid){
|
|
309
319
|
const arr = new Uint8ClampedArray(4 * imgWidth * imgHeight);
|
|
310
320
|
for (var i = 0; i < img.length; i++) {
|