@file-viewer/renderer-ofd 2.1.29 → 2.2.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/dist/ofd.js CHANGED
@@ -3,7 +3,7 @@ const OFD_MIN_SCALE = 0.35;
3
3
  const OFD_MAX_SCALE = 3;
4
4
  const OFD_ZOOM_STEP = 0.1;
5
5
  const ofdStyle = `
6
- .ofd-viewer{position:relative;box-sizing:border-box;min-height:100%;background:#e9edf2;color:#172033;font-family:Aptos,'Segoe UI','PingFang SC','Microsoft YaHei',sans-serif}
6
+ .ofd-viewer{position:relative;box-sizing:border-box;min-height:100%;background:var(--file-viewer-render-surface-background,#e9edf2);color:#172033;font-family:Aptos,'Segoe UI','PingFang SC','Microsoft YaHei',sans-serif}
7
7
  .ofd-viewer *{box-sizing:border-box}
8
8
  .ofd-stage{min-height:100%;padding:18px 0 28px;overflow:auto;scrollbar-gutter:stable}
9
9
  .ofd-state{position:absolute;inset:0;z-index:1;display:flex;align-items:center;justify-content:center;background:rgba(246,248,250,.92);color:#64748b;font-size:14px}
@@ -13,9 +13,9 @@ const ofdStyle = `
13
13
  .ofd-page{display:block;margin-left:auto!important;margin-right:auto!important;background:#fff!important;color:#111827!important;color-scheme:only light;forced-color-adjust:none;isolation:isolate;box-shadow:0 10px 26px rgba(15,23,42,.12);transition:transform .16s ease}
14
14
  .ofd-page,.ofd-page *{color-scheme:only light;forced-color-adjust:none}
15
15
  .ofd-page svg,.ofd-page canvas,.ofd-page img{filter:none!important;mix-blend-mode:normal!important}
16
- [data-viewer-theme='dark'] .ofd-viewer{background:#172033;color:#e5eef8}
16
+ [data-viewer-theme='dark'] .ofd-viewer{background:var(--file-viewer-render-surface-background,#172033);color:#e5eef8}
17
17
  [data-viewer-theme='dark'] .ofd-state{background:rgba(15,23,42,.9);color:#cbd5e1}
18
- @media (prefers-color-scheme:dark){[data-viewer-theme='system'] .ofd-viewer{background:#172033;color:#e5eef8}[data-viewer-theme='system'] .ofd-state{background:rgba(15,23,42,.9);color:#cbd5e1}}
18
+ @media (prefers-color-scheme:dark){[data-viewer-theme='system'] .ofd-viewer{background:var(--file-viewer-render-surface-background,#172033);color:#e5eef8}[data-viewer-theme='system'] .ofd-state{background:rgba(15,23,42,.9);color:#cbd5e1}}
19
19
  @media print{.ofd-viewer{background:#fff!important}.ofd-stage{padding:0!important;overflow:visible!important}.ofd-page-frame{break-after:page;page-break-after:always;margin:0 auto!important}.ofd-page-frame:last-child{break-after:auto;page-break-after:auto}.ofd-page{box-shadow:none!important;transition:none!important}}
20
20
  `;
21
21
  const loadOfdModule = (() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/renderer-ofd",
3
- "version": "2.1.29",
3
+ "version": "2.2.0",
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.29",
56
+ "@file-viewer/core": "2.2.0",
57
57
  "jszip": "^3.10.1"
58
58
  },
59
59
  "devDependencies": {
@@ -65,6 +65,7 @@
65
65
  "build": "tsc -b tsconfig.json",
66
66
  "type-check": "tsc -b tsconfig.json",
67
67
  "verify:github-94": "node scripts/verify-github-94.mjs",
68
+ "verify:image-placement": "node scripts/verify-image-placement.mjs",
68
69
  "verify:pageblock-render": "node scripts/verify-pageblock-render.mjs",
69
70
  "verify:render-fidelity": "node scripts/verify-render-fidelity.mjs"
70
71
  }
@@ -318,8 +318,11 @@ const renderLayer = function (pageDiv, fontResObj, drawParamResObj, multiMediaRe
318
318
  }
319
319
  }
320
320
 
321
- // 部分 OFD 导出工具(如 OFD R&W)会让同一图层内所有图像共享同一个整页 Boundary,
322
- // 图像的真实位置和尺寸完全由 CTM 决定;此时必须优先按 CTM 计算矩形,否则所有图像会被拉伸铺满整页并互相重叠。
321
+ // ImageObject CTM 坐标系以 Boundary 左上角为原点,不是页面原点。
322
+ // 常见 OFD 会把尺寸写在 CTM,把页面位置写在 Boundary,此时 e/f 为 0;
323
+ // OFD R&W 则会给图像一个整页 Boundary,再用 CTM 的 e/f 在该 Boundary 内定位。
324
+ // 两类文件都必须将 Boundary 原点与 CTM 平移叠加;直接把 e/f 当页面
325
+ // 坐标会导致所有 e/f=0 的普通图片集中跑到页面左上角。
323
326
  const parseImageCtm = function (ctm) {
324
327
  if (!ctm) {
325
328
  return null;
@@ -329,7 +332,8 @@ const parseImageCtm = function (ctm) {
329
332
  }
330
333
 
331
334
  const resolveImageGeometry = function (imageObject) {
332
- const boundary = converterBox(parseStBox(imageObject['@_Boundary']));
335
+ const sourceBoundary = parseStBox(imageObject['@_Boundary']);
336
+ const boundary = converterBox(sourceBoundary);
333
337
  const ctmValues = parseImageCtm(imageObject['@_CTM']);
334
338
  if (!ctmValues) {
335
339
  return { boundary, matrix: null };
@@ -337,17 +341,22 @@ const resolveImageGeometry = function (imageObject) {
337
341
  const [a, b, c, d, e, f] = ctmValues;
338
342
  const isAxisAligned = Math.abs(b) < 1e-6 && Math.abs(c) < 1e-6;
339
343
  if (isAxisAligned) {
340
- // CTM 把单位正方形映射到页面坐标系,a/d 为宽高、e/f 为左上角,单位与 Boundary 一致(mm)。
344
+ // CTM 把单位正方形映射到 Boundary 内部坐标系,
345
+ // a/d 为宽高,e/f 为相对 Boundary 原点的平移(mm)。
341
346
  const ctmBoundary = converterBox({
342
- x: Math.min(e, e + a),
343
- y: Math.min(f, f + d),
347
+ x: sourceBoundary.x + Math.min(e, e + a),
348
+ y: sourceBoundary.y + Math.min(f, f + d),
344
349
  w: Math.abs(a),
345
350
  h: Math.abs(d),
346
351
  });
347
352
  return { boundary: ctmBoundary, matrix: null };
348
353
  }
349
- // 存在旋转/斜切时,退化为整页 Boundary 无法给出正确外框,改用矩阵直接变换单位方块。
350
- return { boundary, matrix: ctmValues };
354
+ // 存在旋转/斜切时使用矩阵直接变换单位方块,但仍需叠加
355
+ // Boundary 原点,否则旋转图像也会被错放到页面左上角。
356
+ return {
357
+ boundary,
358
+ matrix: [a, b, c, d, sourceBoundary.x + e, sourceBoundary.y + f],
359
+ };
351
360
  }
352
361
 
353
362
  export const renderImageObject = function (pageWidth, pageHeight, multiMediaResObj, imageObject){