@file-viewer/core 2.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.
Files changed (166) hide show
  1. package/LICENSE +160 -0
  2. package/README.en.md +78 -0
  3. package/README.md +83 -0
  4. package/dist/assets.d.ts +62 -0
  5. package/dist/assets.js +260 -0
  6. package/dist/browser.d.ts +1 -0
  7. package/dist/browser.js +1 -0
  8. package/dist/capabilities.d.ts +24 -0
  9. package/dist/capabilities.js +95 -0
  10. package/dist/document.d.ts +9 -0
  11. package/dist/document.js +86 -0
  12. package/dist/documentDom/anchors.d.ts +7 -0
  13. package/dist/documentDom/anchors.js +196 -0
  14. package/dist/documentDom/index.d.ts +5 -0
  15. package/dist/documentDom/index.js +3 -0
  16. package/dist/documentDom/providers.d.ts +13 -0
  17. package/dist/documentDom/providers.js +52 -0
  18. package/dist/documentDom/scroll.d.ts +12 -0
  19. package/dist/documentDom/scroll.js +42 -0
  20. package/dist/documentDom.d.ts +5 -0
  21. package/dist/documentDom.js +3 -0
  22. package/dist/documentEvents.d.ts +73 -0
  23. package/dist/documentEvents.js +150 -0
  24. package/dist/documentSearch.d.ts +50 -0
  25. package/dist/documentSearch.js +459 -0
  26. package/dist/documentZoom.d.ts +47 -0
  27. package/dist/documentZoom.js +184 -0
  28. package/dist/export.d.ts +26 -0
  29. package/dist/export.js +466 -0
  30. package/dist/formats.d.ts +305 -0
  31. package/dist/formats.js +207 -0
  32. package/dist/headless.d.ts +25 -0
  33. package/dist/headless.js +14 -0
  34. package/dist/index.d.ts +78 -0
  35. package/dist/index.js +118 -0
  36. package/dist/lifecycleFacade.d.ts +46 -0
  37. package/dist/lifecycleFacade.js +68 -0
  38. package/dist/loading.d.ts +59 -0
  39. package/dist/loading.js +489 -0
  40. package/dist/operations.d.ts +287 -0
  41. package/dist/operations.js +485 -0
  42. package/dist/options.d.ts +16 -0
  43. package/dist/options.js +92 -0
  44. package/dist/presentation.d.ts +14 -0
  45. package/dist/presentation.js +16 -0
  46. package/dist/printLayout.d.ts +19 -0
  47. package/dist/printLayout.js +83 -0
  48. package/dist/registry.d.ts +2 -0
  49. package/dist/registry.js +63 -0
  50. package/dist/rendererDispatcher.d.ts +21 -0
  51. package/dist/rendererDispatcher.js +42 -0
  52. package/dist/rendererHandler.d.ts +165 -0
  53. package/dist/rendererHandler.js +354 -0
  54. package/dist/renderers/archive.d.ts +2 -0
  55. package/dist/renderers/archive.js +547 -0
  56. package/dist/renderers/archiveCache.d.ts +10 -0
  57. package/dist/renderers/archiveCache.js +96 -0
  58. package/dist/renderers/archiveFallback.d.ts +7 -0
  59. package/dist/renderers/archiveFallback.js +166 -0
  60. package/dist/renderers/archiveShared.d.ts +23 -0
  61. package/dist/renderers/archiveShared.js +71 -0
  62. package/dist/renderers/audio.d.ts +8 -0
  63. package/dist/renderers/audio.js +219 -0
  64. package/dist/renderers/cad.d.ts +2 -0
  65. package/dist/renderers/cad.js +445 -0
  66. package/dist/renderers/code.d.ts +11 -0
  67. package/dist/renderers/code.js +233 -0
  68. package/dist/renderers/data.d.ts +7 -0
  69. package/dist/renderers/data.js +370 -0
  70. package/dist/renderers/drawing.d.ts +10 -0
  71. package/dist/renderers/drawing.js +537 -0
  72. package/dist/renderers/eda.d.ts +2 -0
  73. package/dist/renderers/eda.js +434 -0
  74. package/dist/renderers/edaParser.d.ts +77 -0
  75. package/dist/renderers/edaParser.js +569 -0
  76. package/dist/renderers/email.d.ts +2 -0
  77. package/dist/renderers/email.js +463 -0
  78. package/dist/renderers/epub.d.ts +2 -0
  79. package/dist/renderers/epub.js +330 -0
  80. package/dist/renderers/geo.d.ts +2 -0
  81. package/dist/renderers/geo.js +284 -0
  82. package/dist/renderers/image.d.ts +2 -0
  83. package/dist/renderers/image.js +179 -0
  84. package/dist/renderers/index.d.ts +21 -0
  85. package/dist/renderers/index.js +207 -0
  86. package/dist/renderers/markdown.d.ts +2 -0
  87. package/dist/renderers/markdown.js +83 -0
  88. package/dist/renderers/model.d.ts +2 -0
  89. package/dist/renderers/model.js +566 -0
  90. package/dist/renderers/ofd.d.ts +2 -0
  91. package/dist/renderers/ofd.js +255 -0
  92. package/dist/renderers/openDocument.d.ts +2 -0
  93. package/dist/renderers/openDocument.js +122 -0
  94. package/dist/renderers/pdf.d.ts +3 -0
  95. package/dist/renderers/pdf.js +846 -0
  96. package/dist/renderers/pdfStyles.d.ts +1 -0
  97. package/dist/renderers/pdfStyles.js +1 -0
  98. package/dist/renderers/pptx.d.ts +2 -0
  99. package/dist/renderers/pptx.js +202 -0
  100. package/dist/renderers/spreadsheet/state.d.ts +80 -0
  101. package/dist/renderers/spreadsheet/state.js +96 -0
  102. package/dist/renderers/spreadsheet/view.d.ts +25 -0
  103. package/dist/renderers/spreadsheet/view.js +833 -0
  104. package/dist/renderers/spreadsheet/worker/index.d.ts +2 -0
  105. package/dist/renderers/spreadsheet/worker/index.js +1 -0
  106. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +73 -0
  107. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +623 -0
  108. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +2 -0
  109. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +73 -0
  110. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +1 -0
  111. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +1 -0
  112. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +18 -0
  113. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +106 -0
  114. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +1 -0
  115. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +11 -0
  116. package/dist/renderers/spreadsheet/worker/type.d.ts +57 -0
  117. package/dist/renderers/spreadsheet/worker/type.js +1 -0
  118. package/dist/renderers/spreadsheet.d.ts +3 -0
  119. package/dist/renderers/spreadsheet.js +929 -0
  120. package/dist/renderers/typst.d.ts +8 -0
  121. package/dist/renderers/typst.js +415 -0
  122. package/dist/renderers/umd/parser.d.ts +30 -0
  123. package/dist/renderers/umd/parser.js +408 -0
  124. package/dist/renderers/umd.d.ts +2 -0
  125. package/dist/renderers/umd.js +297 -0
  126. package/dist/renderers/video.d.ts +8 -0
  127. package/dist/renderers/video.js +108 -0
  128. package/dist/renderers/wordDoc.d.ts +5 -0
  129. package/dist/renderers/wordDoc.js +284 -0
  130. package/dist/renderers/wordDocx.d.ts +5 -0
  131. package/dist/renderers/wordDocx.js +501 -0
  132. package/dist/renderers/wordDocx.worker.d.ts +1 -0
  133. package/dist/renderers/wordDocx.worker.js +96 -0
  134. package/dist/source.d.ts +18 -0
  135. package/dist/source.js +152 -0
  136. package/dist/sourceLoading.d.ts +566 -0
  137. package/dist/sourceLoading.js +918 -0
  138. package/dist/state.d.ts +16 -0
  139. package/dist/state.js +81 -0
  140. package/dist/types.d.ts +446 -0
  141. package/dist/types.js +1 -0
  142. package/dist/viewer.d.ts +8 -0
  143. package/dist/viewer.js +285 -0
  144. package/dist/viewerOperations.d.ts +88 -0
  145. package/dist/viewerOperations.js +242 -0
  146. package/dist/watermark.d.ts +15 -0
  147. package/dist/watermark.js +81 -0
  148. package/dist/worker.d.ts +34 -0
  149. package/dist/worker.js +101 -0
  150. package/package.json +109 -0
  151. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +183 -0
  152. package/vendor/ofd/dltech/jbig2/ccitt.js +1070 -0
  153. package/vendor/ofd/dltech/jbig2/compatibility.js +12 -0
  154. package/vendor/ofd/dltech/jbig2/core_utils.js +180 -0
  155. package/vendor/ofd/dltech/jbig2/is_node.js +27 -0
  156. package/vendor/ofd/dltech/jbig2/jbig2.js +2589 -0
  157. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +81 -0
  158. package/vendor/ofd/dltech/jbig2/primitives.js +387 -0
  159. package/vendor/ofd/dltech/jbig2/stream.js +1348 -0
  160. package/vendor/ofd/dltech/jbig2/util.js +972 -0
  161. package/vendor/ofd/dltech/ofd/ofd.d.ts +11 -0
  162. package/vendor/ofd/dltech/ofd/ofd.js +100 -0
  163. package/vendor/ofd/dltech/ofd/ofd_parser.js +395 -0
  164. package/vendor/ofd/dltech/ofd/ofd_render.js +473 -0
  165. package/vendor/ofd/dltech/ofd/ofd_util.js +350 -0
  166. package/vendor/ofd/dltech/ofd/pipeline.js +26 -0
package/dist/export.js ADDED
@@ -0,0 +1,466 @@
1
+ const escapeHtmlAttribute = (value) => value
2
+ .replace(/&/g, '&')
3
+ .replace(/"/g, '"')
4
+ .replace(/</g, '&lt;')
5
+ .replace(/>/g, '&gt;');
6
+ const EXPORT_DOCUMENT_STYLE = `
7
+ * { box-sizing: border-box; }
8
+ html, body { margin: 0; min-height: 100%; background: #f2f4f7; color: #172033; font-family: Aptos, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; print-color-adjust: exact; -webkit-print-color-adjust: exact; }
9
+ body { padding: 24px; }
10
+ .viewer-export-shell { position: relative; min-height: calc(100vh - 48px); overflow: visible; background: #f2f4f7; }
11
+ .viewer-export-content { position: relative; z-index: 1; contain: none; width: 100%; min-height: 100%; overflow: visible; }
12
+ .viewer-export-content .file-render,
13
+ .viewer-export-content .file-viewer,
14
+ .viewer-export-content .viewer-stage,
15
+ .viewer-export-content .content,
16
+ .viewer-export-content .pdf-shell,
17
+ .viewer-export-content .pdf-content,
18
+ .viewer-export-content .pdf-viewport,
19
+ .viewer-export-content .pdf-wrapper,
20
+ .viewer-export-content .docx-fit-viewer,
21
+ .viewer-export-content .docx-wrapper,
22
+ .viewer-export-content .msdoc-stage,
23
+ .viewer-export-content .code-viewer,
24
+ .viewer-export-content .markdown-viewer,
25
+ .viewer-export-content .email-shell,
26
+ .viewer-export-content .archive-shell,
27
+ .viewer-export-content .eda-shell,
28
+ .viewer-export-content .ebook-shell,
29
+ .viewer-export-content .umd-shell,
30
+ .viewer-export-content .drawing-shell,
31
+ .viewer-export-content .audio-shell,
32
+ .viewer-export-content .cad-shell,
33
+ .viewer-export-content .cad-body,
34
+ .viewer-export-content .cad-canvas-wrap,
35
+ .viewer-export-content .dwg-preview-frame {
36
+ position: relative !important;
37
+ inset: auto !important;
38
+ contain: none !important;
39
+ width: 100% !important;
40
+ height: auto !important;
41
+ min-height: 0 !important;
42
+ max-height: none !important;
43
+ overflow: visible !important;
44
+ }
45
+ .viewer-export-content .docx-wrapper {
46
+ display: block !important;
47
+ padding: 0 !important;
48
+ background: transparent !important;
49
+ }
50
+ .viewer-export-content .docx-print-document {
51
+ display: block !important;
52
+ width: fit-content !important;
53
+ max-width: 100% !important;
54
+ height: auto !important;
55
+ overflow: visible !important;
56
+ margin: 0 auto !important;
57
+ }
58
+ .viewer-export-content .docx-page-frame {
59
+ position: relative !important;
60
+ width: var(--viewer-print-page-width, fit-content) !important;
61
+ height: var(--viewer-print-page-height, auto) !important;
62
+ min-height: var(--viewer-print-page-height, 0) !important;
63
+ max-width: 100% !important;
64
+ margin: 0 auto 18px !important;
65
+ overflow: hidden !important;
66
+ break-inside: avoid;
67
+ page-break-inside: avoid;
68
+ break-after: page;
69
+ page-break-after: always;
70
+ }
71
+ .viewer-export-content .msdoc-page {
72
+ position: relative !important;
73
+ width: var(--viewer-print-page-width, 794px) !important;
74
+ min-height: var(--viewer-print-page-height, 1123px) !important;
75
+ max-width: 100% !important;
76
+ height: auto !important;
77
+ margin: 0 auto 18px !important;
78
+ overflow: visible !important;
79
+ break-after: page;
80
+ page-break-after: always;
81
+ }
82
+ .viewer-export-content .docx-page-frame:last-child,
83
+ .viewer-export-content .msdoc-page:last-child {
84
+ break-after: auto;
85
+ page-break-after: auto;
86
+ }
87
+ .viewer-export-content .docx-page-frame > section.docx {
88
+ position: relative !important;
89
+ top: auto !important;
90
+ left: auto !important;
91
+ width: var(--viewer-print-page-width, auto) !important;
92
+ min-height: var(--viewer-print-page-height, auto) !important;
93
+ max-width: none !important;
94
+ margin: 0 auto !important;
95
+ overflow: visible !important;
96
+ transform: none !important;
97
+ box-shadow: none !important;
98
+ break-inside: avoid;
99
+ page-break-inside: avoid;
100
+ }
101
+ .viewer-export-content .msdoc-stage {
102
+ display: block !important;
103
+ padding: 0 !important;
104
+ background: transparent !important;
105
+ }
106
+ .viewer-export-content .msdoc-page > .msdoc-root {
107
+ margin: 0 auto !important;
108
+ box-shadow: none !important;
109
+ overflow: visible !important;
110
+ }
111
+ .viewer-export-content .pdf-toolbar,
112
+ .viewer-export-content .pdf-nav-pane,
113
+ .viewer-export-content .viewer-actions,
114
+ .viewer-export-content .code-toolbar,
115
+ .viewer-export-content .umd-toolbar,
116
+ .viewer-export-content .drawing-toolbar,
117
+ .viewer-export-content .cad-toolbar {
118
+ display: none !important;
119
+ }
120
+ .viewer-export-content .pdf-content,
121
+ .viewer-export-content .pdf-shell--nav-hidden .pdf-content,
122
+ .viewer-export-content .cad-body.without-layers {
123
+ display: block !important;
124
+ grid-template-columns: none !important;
125
+ }
126
+ .viewer-export-content .pdfViewer { padding: 0 !important; }
127
+ .viewer-export-content .pdfViewer .page {
128
+ margin: 0 auto 16px !important;
129
+ border: 0 !important;
130
+ box-shadow: none !important;
131
+ break-after: page;
132
+ page-break-after: always;
133
+ }
134
+ .viewer-export-content .pdfViewer .page:last-child {
135
+ break-after: auto;
136
+ page-break-after: auto;
137
+ }
138
+ .viewer-export-content .pdf-export-document {
139
+ display: grid;
140
+ justify-items: center;
141
+ gap: 18px;
142
+ padding: 4px 0;
143
+ }
144
+ .viewer-export-content .pdf-export-page {
145
+ width: var(--viewer-print-page-width, auto);
146
+ height: var(--viewer-print-page-height, auto);
147
+ max-width: 100%;
148
+ overflow: hidden;
149
+ background: #ffffff;
150
+ box-shadow: 0 12px 32px rgba(15, 23, 42, 0.12);
151
+ break-inside: avoid;
152
+ page-break-inside: avoid;
153
+ break-after: page;
154
+ page-break-after: always;
155
+ }
156
+ .viewer-export-content .pdf-export-page:last-child {
157
+ break-after: auto;
158
+ page-break-after: auto;
159
+ }
160
+ .viewer-export-content .pdf-export-page img {
161
+ display: block;
162
+ width: 100%;
163
+ height: 100%;
164
+ object-fit: contain;
165
+ }
166
+ .viewer-export-content .pptx-wrapper {
167
+ width: 100% !important;
168
+ max-width: 100% !important;
169
+ height: auto !important;
170
+ overflow: visible !important;
171
+ transform: none !important;
172
+ }
173
+ .viewer-export-content .pptx-wrapper .slide {
174
+ margin: 0 auto 18px !important;
175
+ break-inside: avoid;
176
+ page-break-inside: avoid;
177
+ break-after: page;
178
+ page-break-after: always;
179
+ box-shadow: none !important;
180
+ }
181
+ .viewer-export-content .pptx-wrapper .slide:last-child {
182
+ break-after: auto;
183
+ page-break-after: auto;
184
+ }
185
+ .viewer-export-content .ofd-stage {
186
+ padding: 0 !important;
187
+ overflow: visible !important;
188
+ }
189
+ .viewer-export-content .ofd-page,
190
+ .viewer-export-content .drawing-svg,
191
+ .viewer-export-content .cad-canvas-wrap,
192
+ .viewer-export-content .dwg-preview-frame {
193
+ break-inside: avoid;
194
+ page-break-inside: avoid;
195
+ break-after: page;
196
+ page-break-after: always;
197
+ box-shadow: none !important;
198
+ }
199
+ .viewer-export-content .ofd-page:last-child,
200
+ .viewer-export-content .drawing-svg:last-child,
201
+ .viewer-export-content .cad-canvas-wrap:last-child,
202
+ .viewer-export-content .dwg-preview-frame:last-child {
203
+ break-after: auto;
204
+ page-break-after: auto;
205
+ }
206
+ .viewer-export-content .code-area {
207
+ overflow: visible !important;
208
+ white-space: pre-wrap !important;
209
+ word-break: break-word !important;
210
+ }
211
+ .viewer-export-content .umd-body,
212
+ .viewer-export-content .umd-stage-wrap,
213
+ .viewer-export-content .umd-stage {
214
+ display: block !important;
215
+ height: auto !important;
216
+ max-height: none !important;
217
+ overflow: visible !important;
218
+ }
219
+ .viewer-export-content .umd-toc {
220
+ display: none !important;
221
+ }
222
+ img, canvas, svg, video { max-width: 100%; }
223
+ @media print {
224
+ @page { margin: 12mm; }
225
+ html, body { min-height: auto; background: #ffffff; }
226
+ body { padding: 0; }
227
+ .viewer-export-shell,
228
+ .viewer-export-content {
229
+ min-height: 0;
230
+ overflow: visible;
231
+ background: #ffffff;
232
+ }
233
+ .viewer-export-content .pdf-export-document {
234
+ display: block;
235
+ padding: 0;
236
+ }
237
+ .viewer-export-content .pdf-export-page {
238
+ width: var(--viewer-print-page-width, auto) !important;
239
+ height: var(--viewer-print-page-height, auto) !important;
240
+ max-width: none !important;
241
+ margin: 0;
242
+ overflow: hidden;
243
+ box-shadow: none;
244
+ }
245
+ .viewer-export-content .docx-page-frame {
246
+ width: var(--viewer-print-page-width, auto) !important;
247
+ height: var(--viewer-print-page-height, auto) !important;
248
+ min-height: var(--viewer-print-page-height, 0) !important;
249
+ max-width: none !important;
250
+ margin: 0 !important;
251
+ overflow: hidden !important;
252
+ }
253
+ .viewer-export-content .msdoc-page {
254
+ width: var(--viewer-print-page-width, 794px) !important;
255
+ min-height: var(--viewer-print-page-height, 1123px) !important;
256
+ max-width: none !important;
257
+ margin: 0 !important;
258
+ overflow: visible !important;
259
+ }
260
+ .viewer-export-content .docx-page-frame > section.docx,
261
+ .viewer-export-content .msdoc-page > .msdoc-root {
262
+ width: var(--viewer-print-page-width, 100%) !important;
263
+ max-width: none !important;
264
+ border: 0 !important;
265
+ }
266
+ .viewer-export-content .pptx-wrapper .slide,
267
+ .viewer-export-content .ofd-page,
268
+ .viewer-export-content .drawing-svg,
269
+ .viewer-export-content .cad-canvas-wrap,
270
+ .viewer-export-content .dwg-preview-frame {
271
+ box-shadow: none !important;
272
+ }
273
+ }
274
+ `;
275
+ export const collectDocumentStyles = () => {
276
+ return Array.from(document.querySelectorAll('style, link[rel="stylesheet"]'))
277
+ .map(node => {
278
+ if (node instanceof HTMLStyleElement) {
279
+ return `<style>${node.textContent || ''}</style>`;
280
+ }
281
+ if (node.href) {
282
+ return `<link rel="stylesheet" href="${escapeHtmlAttribute(node.href)}" />`;
283
+ }
284
+ return '';
285
+ })
286
+ .filter(Boolean)
287
+ .join('\n');
288
+ };
289
+ export const buildExportHtmlDocument = ({ contentHtml, includeDocumentStyles = true, printStyle = '', title, watermarkInlineStyle = '' }) => {
290
+ const watermark = watermarkInlineStyle
291
+ ? `<div class="viewer-export-watermark" style="${watermarkInlineStyle}"></div>`
292
+ : '';
293
+ const styles = includeDocumentStyles ? collectDocumentStyles() : '';
294
+ const printOverrideStyle = printStyle ? `<style data-viewer-print-style>${printStyle}</style>` : '';
295
+ const safeTitle = escapeHtmlAttribute(title);
296
+ return `<!doctype html>
297
+ <html lang="zh-CN">
298
+ <head>
299
+ <meta charset="utf-8" />
300
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
301
+ <title>${safeTitle}</title>
302
+ ${styles}
303
+ <style>${EXPORT_DOCUMENT_STYLE}</style>
304
+ </head>
305
+ <body>
306
+ <main class="viewer-export-shell">
307
+ <div class="viewer-export-content">${contentHtml}</div>
308
+ ${watermark}
309
+ </main>
310
+ ${printOverrideStyle}
311
+ </body>
312
+ </html>`;
313
+ };
314
+ export const triggerFileViewerBlobDownload = (blob, name) => {
315
+ const objectUrl = URL.createObjectURL(blob);
316
+ const link = document.createElement('a');
317
+ link.href = objectUrl;
318
+ link.download = name;
319
+ link.rel = 'noopener';
320
+ document.body.appendChild(link);
321
+ link.click();
322
+ link.remove();
323
+ window.setTimeout(() => URL.revokeObjectURL(objectUrl), 4000);
324
+ };
325
+ export const triggerFileViewerUrlDownload = (url, name) => {
326
+ const link = document.createElement('a');
327
+ link.href = url;
328
+ link.download = name;
329
+ link.rel = 'noopener';
330
+ link.target = '_blank';
331
+ document.body.appendChild(link);
332
+ link.click();
333
+ link.remove();
334
+ };
335
+ export const replaceFileViewerCanvasWithImages = (source, clone) => {
336
+ const sourceCanvases = Array.from(source.querySelectorAll('canvas'));
337
+ const clonedCanvases = Array.from(clone.querySelectorAll('canvas'));
338
+ clonedCanvases.forEach((canvas, index) => {
339
+ const sourceCanvas = sourceCanvases[index];
340
+ if (!sourceCanvas) {
341
+ return;
342
+ }
343
+ try {
344
+ const image = document.createElement('img');
345
+ image.src = sourceCanvas.toDataURL('image/png');
346
+ image.alt = 'rendered canvas';
347
+ image.style.maxWidth = '100%';
348
+ image.style.display = 'block';
349
+ image.style.margin = '0 auto';
350
+ canvas.replaceWith(image);
351
+ }
352
+ catch {
353
+ // 跨域资源污染过的 canvas 无法导出,只保留原 canvas 占位。
354
+ }
355
+ });
356
+ };
357
+ export const waitForFileViewerNextPaint = (targetWindow) => {
358
+ return new Promise(resolve => {
359
+ const currentWindow = targetWindow || (typeof window !== 'undefined' ? window : undefined);
360
+ if (!currentWindow || typeof currentWindow.requestAnimationFrame !== 'function') {
361
+ const schedule = (currentWindow === null || currentWindow === void 0 ? void 0 : currentWindow.setTimeout)
362
+ ? currentWindow.setTimeout.bind(currentWindow)
363
+ : globalThis.setTimeout.bind(globalThis);
364
+ schedule(() => resolve(), 0);
365
+ return;
366
+ }
367
+ const requestAnimationFrame = currentWindow.requestAnimationFrame.bind(currentWindow);
368
+ requestAnimationFrame(() => {
369
+ requestAnimationFrame(() => resolve());
370
+ });
371
+ });
372
+ };
373
+ export const waitForFileViewerImages = async (root) => {
374
+ const images = Array.from(root.querySelectorAll('img'));
375
+ await Promise.all(images.map(async (image) => {
376
+ if (image.complete) {
377
+ return;
378
+ }
379
+ if ('decode' in image) {
380
+ try {
381
+ await image.decode();
382
+ return;
383
+ }
384
+ catch {
385
+ // decode 失败时继续走 load/error 事件,避免单张异常图片阻塞打印。
386
+ }
387
+ }
388
+ await new Promise(resolve => {
389
+ image.addEventListener('load', () => resolve(), { once: true });
390
+ image.addEventListener('error', () => resolve(), { once: true });
391
+ });
392
+ }));
393
+ };
394
+ export const waitForFileViewerPrintWindowReady = async (printWindow) => {
395
+ const { document: printDocument } = printWindow;
396
+ if (printDocument.readyState !== 'complete') {
397
+ await new Promise(resolve => {
398
+ printWindow.addEventListener('load', () => resolve(), { once: true });
399
+ printWindow.setTimeout(() => resolve(), 1200);
400
+ });
401
+ }
402
+ await Promise.all(Array.from(printDocument.images).map(async (image) => {
403
+ if (image.complete) {
404
+ return;
405
+ }
406
+ if ('decode' in image) {
407
+ try {
408
+ await image.decode();
409
+ return;
410
+ }
411
+ catch {
412
+ // 图片解码失败不阻塞打印,浏览器仍会尝试按现有资源输出。
413
+ }
414
+ }
415
+ await new Promise(resolve => {
416
+ image.addEventListener('load', () => resolve(), { once: true });
417
+ image.addEventListener('error', () => resolve(), { once: true });
418
+ printWindow.setTimeout(() => resolve(), 1500);
419
+ });
420
+ }));
421
+ await new Promise(resolve => {
422
+ printWindow.requestAnimationFrame(() => {
423
+ printWindow.requestAnimationFrame(() => resolve());
424
+ });
425
+ });
426
+ };
427
+ export const resolveFileViewerPrintStyle = async (adapter, options) => {
428
+ if (options.mode !== 'print' || !(adapter === null || adapter === void 0 ? void 0 : adapter.printStyle)) {
429
+ return '';
430
+ }
431
+ if (typeof adapter.printStyle === 'function') {
432
+ return await adapter.printStyle(options);
433
+ }
434
+ return adapter.printStyle;
435
+ };
436
+ export const prepareFileViewerRenderedContentForSnapshot = async (source, adapter) => {
437
+ var _a;
438
+ await ((_a = adapter === null || adapter === void 0 ? void 0 : adapter.beforeSnapshot) === null || _a === void 0 ? void 0 : _a.call(adapter));
439
+ await waitForFileViewerNextPaint();
440
+ await waitForFileViewerImages(source);
441
+ };
442
+ export const buildFileViewerRenderedHtmlDocument = async ({ source, mode = 'export', title, adapter = null, watermarkInlineStyle = '' }) => {
443
+ const exportOptions = { mode, title };
444
+ const toHtml = adapter === null || adapter === void 0 ? void 0 : adapter.toHtml;
445
+ if (toHtml) {
446
+ const contentHtml = await toHtml(exportOptions);
447
+ const printStyle = await resolveFileViewerPrintStyle(adapter, exportOptions);
448
+ return buildExportHtmlDocument({
449
+ contentHtml,
450
+ includeDocumentStyles: adapter.includeDocumentStyles !== false,
451
+ printStyle,
452
+ title,
453
+ watermarkInlineStyle
454
+ });
455
+ }
456
+ await prepareFileViewerRenderedContentForSnapshot(source, adapter);
457
+ const clone = source.cloneNode(true);
458
+ replaceFileViewerCanvasWithImages(source, clone);
459
+ const printStyle = await resolveFileViewerPrintStyle(adapter, exportOptions);
460
+ return buildExportHtmlDocument({
461
+ contentHtml: clone.innerHTML,
462
+ printStyle,
463
+ title,
464
+ watermarkInlineStyle
465
+ });
466
+ };