@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.7",
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.7",
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
- if (item['@_Type'].toLowerCase() === 'image') {
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 img = await parseOtherImageFromZip(zip, file);
320
- multiMediaResObj[item['@_ID']] = {img, 'format': 'png'};
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 = 'data:image/png;base64,' + bytes;
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
- if (multiMediaResObj[resId].format === 'gbig2') {
299
- const img = multiMediaResObj[resId].img;
300
- const width = multiMediaResObj[resId].width;
301
- const height = multiMediaResObj[resId].height;
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, multiMediaResObj[resId].img, boundary, false, false, null, null, imageObject['pfIndex']);
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++) {