@flyfish-group/file-viewer3 1.0.20 → 1.0.22

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 (288) hide show
  1. package/README.en.md +373 -0
  2. package/README.md +60 -25
  3. package/dist/components/3MFLoader.js +1 -1
  4. package/dist/components/AMFLoader.js +1 -1
  5. package/dist/components/ArchiveViewer.js +1 -1
  6. package/dist/components/AudioViewer.js +1 -1
  7. package/dist/components/CadViewer.js +1 -1
  8. package/dist/components/CodeViewer.js +1 -1
  9. package/dist/components/ColladaLoader.js +1 -1
  10. package/dist/components/DrawingViewer.js +1 -1
  11. package/dist/components/EdaViewer.js +1 -1
  12. package/dist/components/EmailViewer.js +1 -1
  13. package/dist/components/EpubViewer.js +1 -1
  14. package/dist/components/FBXLoader.js +1 -1
  15. package/dist/components/GLTFLoader.js +1 -1
  16. package/dist/components/ImageViewer.js +1 -1
  17. package/dist/components/KMZLoader.js +1 -1
  18. package/dist/components/MarkdownViewer.js +1 -1
  19. package/dist/components/ModelViewer.js +1 -1
  20. package/dist/components/OBJLoader.js +1 -1
  21. package/dist/components/OfdViewer.js +1 -1
  22. package/dist/components/PCDLoader.js +1 -1
  23. package/dist/components/PLYLoader.js +1 -1
  24. package/dist/components/PdfView.js +5316 -4918
  25. package/dist/components/PptxRender.js +1 -1
  26. package/dist/components/STLLoader.js +1 -1
  27. package/dist/components/TDSLoader.js +1 -1
  28. package/dist/components/TypstViewer.js +3 -3
  29. package/dist/components/USDLoader.js +1 -1
  30. package/dist/components/UmdViewer.js +1 -1
  31. package/dist/components/VRMLLoader.js +1 -1
  32. package/dist/components/VTKLoader.js +1 -1
  33. package/dist/components/XYZLoader.js +1 -1
  34. package/dist/components/XlsxTable.js +1 -1
  35. package/dist/components/__vite-browser-external.js +1 -1
  36. package/dist/components/_plugin-vue_export-helper.js +1 -1
  37. package/dist/components/ar-SA-G6X2FPQ2.js +1 -1
  38. package/dist/components/arc.js +1 -1
  39. package/dist/components/architecture-7EHR7CIX.js +1 -1
  40. package/dist/components/architectureDiagram-3BPJPVTR.js +1 -1
  41. package/dist/components/archive.js +1 -1
  42. package/dist/components/asyncToGenerator.js +1 -1
  43. package/dist/components/audio.js +1 -1
  44. package/dist/components/az-AZ-76LH7QW2.js +1 -1
  45. package/dist/components/bash.js +1 -1
  46. package/dist/components/bg-BG-XCXSNQG7.js +1 -1
  47. package/dist/components/blockDiagram-GPEHLZMM.js +1 -1
  48. package/dist/components/bn-BD-2XOGV67Q.js +1 -1
  49. package/dist/components/c4Diagram-AAUBKEIU.js +1 -1
  50. package/dist/components/ca-ES-6MX7JW3Y.js +1 -1
  51. package/dist/components/cad.js +1 -1
  52. package/dist/components/cfb.js +1 -1
  53. package/dist/components/channel.js +1 -1
  54. package/dist/components/chunk-2J33WTMH.js +1 -1
  55. package/dist/components/chunk-3OPIFGDE.js +1 -1
  56. package/dist/components/chunk-4BX2VUAB.js +1 -1
  57. package/dist/components/chunk-55IACEB6.js +1 -1
  58. package/dist/components/chunk-5ZQYHXKU.js +1 -1
  59. package/dist/components/chunk-6U3AYISY.js +1 -1
  60. package/dist/components/chunk-727SXJPM.js +1 -1
  61. package/dist/components/chunk-AGHRB4JF.js +1 -1
  62. package/dist/components/chunk-AQP2D5EJ.js +1 -1
  63. package/dist/components/chunk-BSJP7CBP.js +1 -1
  64. package/dist/components/chunk-CSCIHK7Q.js +1 -1
  65. package/dist/components/chunk-EIO257PC.js +563 -564
  66. package/dist/components/chunk-FMBD7UC4.js +1 -1
  67. package/dist/components/chunk-K2UTITRG.js +1 -1
  68. package/dist/components/chunk-KSCS5N6A.js +1 -1
  69. package/dist/components/chunk-L5ZTLDWV.js +1 -1
  70. package/dist/components/chunk-LZXEDZCA.js +1 -1
  71. package/dist/components/chunk-ND2GUHAM.js +1 -1
  72. package/dist/components/chunk-NNHCCRGN.js +1 -0
  73. package/dist/components/chunk-NZK2D7GU.js +1 -1
  74. package/dist/components/chunk-O5CBEL6O.js +1 -1
  75. package/dist/components/chunk-QZHKN3VN.js +1 -1
  76. package/dist/components/chunk-SRAX5OIU.js +1 -1
  77. package/dist/components/chunk-WU5MYG2G.js +1 -1
  78. package/dist/components/chunk-XPW4576I.js +1 -1
  79. package/dist/components/chunk-Z3N5DIM6.js +1 -1
  80. package/dist/components/chunk-ZUYEQ4TG.js +1 -1
  81. package/dist/components/chunk.js +1 -1
  82. package/dist/components/classDiagram-4FO5ZUOK.js +1 -1
  83. package/dist/components/classDiagram-v2-Q7XG4LA2.js +1 -1
  84. package/dist/components/compiler.js +1 -1
  85. package/dist/components/core.js +1 -1
  86. package/dist/components/cose-bilkent-S5V4N54A.js +1 -1
  87. package/dist/components/cpp.js +1 -1
  88. package/dist/components/cs-CZ-2BRQDIVT.js +1 -1
  89. package/dist/components/csharp.js +1 -1
  90. package/dist/components/css.js +1 -1
  91. package/dist/components/cytoscape.esm.js +1 -1
  92. package/dist/components/da-DK-5WZEPLOC.js +1 -1
  93. package/dist/components/dagre-BM42HDAG.js +1 -1
  94. package/dist/components/dagre.js +1 -1
  95. package/dist/components/de-DE-XR44H4JA.js +1 -1
  96. package/dist/components/defaultLocale.js +1 -1
  97. package/dist/components/defineProperty.js +1 -1
  98. package/dist/components/diagram-2AECGRRQ.js +1 -1
  99. package/dist/components/diagram-5GNKFQAL.js +1 -1
  100. package/dist/components/diagram-KO2AKTUF.js +1 -1
  101. package/dist/components/diagram-LMA3HP47.js +1 -1
  102. package/dist/components/diagram-OG6HWLK6.js +1 -1
  103. package/dist/components/diff.js +1 -1
  104. package/dist/components/directory-open-01563666.js +1 -1
  105. package/dist/components/directory-open-4ed118d0.js +1 -1
  106. package/dist/components/dist.js +1 -1
  107. package/dist/components/dist2.js +1 -1
  108. package/dist/components/dist3.js +1 -1
  109. package/dist/components/docx-preview.js +1 -1
  110. package/dist/components/drawing.js +1 -1
  111. package/dist/components/ebook.js +1 -1
  112. package/dist/components/eda.js +1 -1
  113. package/dist/components/el-GR-BZB4AONW.js +1 -1
  114. package/dist/components/email.js +1 -1
  115. package/dist/components/en-B4ZKOASM.js +1 -1
  116. package/dist/components/erDiagram-TEJ5UH35.js +1 -1
  117. package/dist/components/es-ES-U4NZUMDT.js +1 -1
  118. package/dist/components/eu-ES-A7QVB2H4.js +1 -1
  119. package/dist/components/eventmodeling-FCH6USID.js +1 -1
  120. package/dist/components/fa-IR-HGAKTJCU.js +1 -1
  121. package/dist/components/fflate.module.js +1 -1
  122. package/dist/components/fi-FI-Z5N7JZ37.js +1 -1
  123. package/dist/components/file-open-002ab408.js +1 -1
  124. package/dist/components/file-open-7c801643.js +1 -1
  125. package/dist/components/file-save-3189631c.js +1 -1
  126. package/dist/components/file-save-745eba88.js +1 -1
  127. package/dist/components/flowDiagram-I6XJVG4X.js +1 -1
  128. package/dist/components/fr-FR-RHASNOE6.js +1 -1
  129. package/dist/components/ganttDiagram-6RSMTGT7.js +1 -1
  130. package/dist/components/gitGraph-WXDBUCRP.js +1 -1
  131. package/dist/components/gitGraphDiagram-PVQCEYII.js +1 -1
  132. package/dist/components/gl-ES-HMX3MZ6V.js +1 -1
  133. package/dist/components/global-compiler.js +1 -1
  134. package/dist/components/global-renderer.js +1 -1
  135. package/dist/components/go.js +1 -1
  136. package/dist/components/graphlib.js +1 -1
  137. package/dist/components/he-IL-6SHJWFNN.js +1 -1
  138. package/dist/components/hi-IN-IWLTKZ5I.js +1 -1
  139. package/dist/components/hu-HU-A5ZG7DT2.js +1 -1
  140. package/dist/components/id-ID-SAP4L64H.js +1 -1
  141. package/dist/components/image-GAAHSSAO.js +1 -1
  142. package/dist/components/image-blob-reduce.esm.js +1 -1
  143. package/dist/components/image.js +1 -1
  144. package/dist/components/info-J43DQDTF.js +1 -1
  145. package/dist/components/infoDiagram-5YYISTIA.js +1 -1
  146. package/dist/components/ini.js +1 -1
  147. package/dist/components/init.js +1 -1
  148. package/dist/components/ishikawaDiagram-YF4QCWOH.js +1 -1
  149. package/dist/components/it-IT-JPQ66NNP.js +1 -1
  150. package/dist/components/ja-JP-DBVTYXUO.js +1 -1
  151. package/dist/components/java.js +1 -1
  152. package/dist/components/javascript.js +1 -1
  153. package/dist/components/journeyDiagram-JHISSGLW.js +1 -1
  154. package/dist/components/json.js +1 -1
  155. package/dist/components/jszip.min.js +1 -1
  156. package/dist/components/kaa-6HZHGXH3.js +1 -1
  157. package/dist/components/kab-KAB-ZGHBKWFO.js +1 -1
  158. package/dist/components/kanban-definition-UN3LZRKU.js +1 -1
  159. package/dist/components/katex.js +1 -1
  160. package/dist/components/kk-KZ-P5N5QNE5.js +1 -1
  161. package/dist/components/km-KH-HSX4SM5Z.js +1 -1
  162. package/dist/components/ko-KR-MTYHY66A.js +1 -1
  163. package/dist/components/ku-TR-6OUDTVRD.js +1 -1
  164. package/dist/components/lib.js +1 -1
  165. package/dist/components/libarchive.js +1 -1
  166. package/dist/components/linear.js +1 -1
  167. package/dist/components/lt-LT-XHIRWOB4.js +1 -1
  168. package/dist/components/lv-LV-5QDEKY6T.js +1 -1
  169. package/dist/components/markdown.js +1 -1
  170. package/dist/components/md.js +1 -1
  171. package/dist/components/mermaid-parser.core.js +1 -1
  172. package/dist/components/mindmap-definition-RKZ34NQL.js +1 -1
  173. package/dist/components/model.js +1 -1
  174. package/dist/components/mp4.js +1 -1
  175. package/dist/components/mr-IN-CRQNXWMA.js +1 -1
  176. package/dist/components/my-MM-5M5IBNSE.js +1 -1
  177. package/dist/components/nb-NO-T6EIAALU.js +1 -1
  178. package/dist/components/nestedRender.js +1 -1
  179. package/dist/components/nl-NL-IS3SIHDZ.js +1 -1
  180. package/dist/components/nn-NO-6E72VCQL.js +1 -1
  181. package/dist/components/objectSpread2.js +1 -1
  182. package/dist/components/objectWithoutProperties.js +1 -1
  183. package/dist/components/oc-FR-POXYY2M6.js +1 -1
  184. package/dist/components/ofd.js +1 -1
  185. package/dist/components/ofd2.js +1 -1
  186. package/dist/components/ordinal.js +1 -1
  187. package/dist/components/pa-IN-N4M65BXN.js +1 -1
  188. package/dist/components/packet-YPE3B663.js +1 -1
  189. package/dist/components/pdf.js +1 -1
  190. package/dist/components/percentages-BXMCSKIN.js +1 -1
  191. package/dist/components/php.js +1 -1
  192. package/dist/components/pica.js +1 -1
  193. package/dist/components/pie-LRSECV5Y.js +1 -1
  194. package/dist/components/pie.js +1 -1
  195. package/dist/components/pieDiagram-4H26LBE5.js +1 -1
  196. package/dist/components/pl-PL-T2D74RX3.js +1 -1
  197. package/dist/components/postal-mime.js +1 -1
  198. package/dist/components/pptx.js +1 -1
  199. package/dist/components/printLayout.js +1 -1
  200. package/dist/components/prod.js +1 -1
  201. package/dist/components/pt-BR-5N22H2LF.js +1 -1
  202. package/dist/components/pt-PT-UZXXM6DQ.js +1 -1
  203. package/dist/components/python.js +1 -1
  204. package/dist/components/quadrantDiagram-W4KKPZXB.js +1 -1
  205. package/dist/components/radar-GUYGQ44K.js +1 -1
  206. package/dist/components/renderer.js +1 -1
  207. package/dist/components/requirementDiagram-4Y6WPE33.js +1 -1
  208. package/dist/components/ro-RO-JPDTUUEW.js +1 -1
  209. package/dist/components/rough.esm.js +1 -1
  210. package/dist/components/roundRect.js +1 -1
  211. package/dist/components/ru-RU-B4JR7IUQ.js +1 -1
  212. package/dist/components/rust.js +1 -1
  213. package/dist/components/sankeyDiagram-5OEKKPKP.js +1 -1
  214. package/dist/components/sequenceDiagram-3UESZ5HK.js +1 -1
  215. package/dist/components/shared.js +1 -1
  216. package/dist/components/shared2.js +1 -1
  217. package/dist/components/si-LK-N5RQ5JYF.js +1 -1
  218. package/dist/components/sk-SK-C5VTKIMK.js +1 -1
  219. package/dist/components/sl-SI-NN7IZMDC.js +1 -1
  220. package/dist/components/sourceLoading.js +1 -1
  221. package/dist/components/sql.js +1 -1
  222. package/dist/components/src.js +1 -1
  223. package/dist/components/src2.js +1 -1
  224. package/dist/components/stateDiagram-AJRCARHV.js +1 -1
  225. package/dist/components/stateDiagram-v2-BHNVJYJU.js +1 -1
  226. package/dist/components/subset-shared.chunk.js +1 -1
  227. package/dist/components/subset-worker.chunk.js +1 -1
  228. package/dist/components/sv-SE-XGPEYMSR.js +1 -1
  229. package/dist/components/ta-IN-2NMHFXQM.js +1 -1
  230. package/dist/components/text.js +1 -1
  231. package/dist/components/th-TH-HPSO5L25.js +1 -1
  232. package/dist/components/three.module.js +1 -1
  233. package/dist/components/time.js +1 -1
  234. package/dist/components/timeline-definition-PNZ67QCA.js +1 -1
  235. package/dist/components/tr-TR-DEFEU3FU.js +1 -1
  236. package/dist/components/treeView-BLDUP644.js +1 -1
  237. package/dist/components/treemap-LRROVOQU.js +1 -1
  238. package/dist/components/typescript.js +1 -1
  239. package/dist/components/typst.js +1 -1
  240. package/dist/components/uk-UA-QMV73CPH.js +1 -1
  241. package/dist/components/umd.js +1 -1
  242. package/dist/components/use.js +1 -1
  243. package/dist/components/util.js +1 -1
  244. package/dist/components/vennDiagram-CIIHVFJN.js +1 -1
  245. package/dist/components/vi-VN-M7AON7JQ.js +1 -1
  246. package/dist/components/wardley-L42UT6IY.js +1 -1
  247. package/dist/components/wardleyDiagram-YWT4CUSO.js +1 -1
  248. package/dist/components/wasm-pack-shim.js +1 -1
  249. package/dist/components/wasm-pack-shim2.js +1 -1
  250. package/dist/components/wasm.js +1 -1
  251. package/dist/components/word.js +1 -1
  252. package/dist/components/worker-ref.js +1 -1
  253. package/dist/components/xlsx.js +1 -1
  254. package/dist/components/xml.js +1 -1
  255. package/dist/components/xychartDiagram-2RQKCTM6.js +1 -1
  256. package/dist/components/yaml.js +1 -1
  257. package/dist/components/zh-CN-LNUGB5OW.js +1 -1
  258. package/dist/components/zh-HK-E62DVLB3.js +1 -1
  259. package/dist/components/zh-TW-RAJ6MFWO.js +1 -1
  260. package/dist/file-viewer3.css +1 -1
  261. package/dist/index.mjs +1 -1
  262. package/dist/src/App.vue.d.ts +3 -0
  263. package/dist/src/compare/CompareApp.vue.d.ts +3 -0
  264. package/dist/src/compare/main.d.ts +0 -0
  265. package/dist/src/components/HelloWorld.vue.d.ts +3 -0
  266. package/dist/src/components/utils.d.ts +1 -1
  267. package/dist/src/package/common/type.d.ts +26 -0
  268. package/dist/src/package/components/FileViewer/FileViewer.vue.d.ts +1 -1
  269. package/dist/src/package/components/FileViewer/useViewerExport.d.ts +1 -1
  270. package/dist/src/package/components/FileViewer/util.d.ts +2 -2
  271. package/dist/src/package/vendors/archive/ArchiveViewer.vue.d.ts +1 -1
  272. package/dist/src/package/vendors/archive/index.d.ts +1 -1
  273. package/dist/src/package/vendors/eda/index.d.ts +1 -1
  274. package/dist/src/package/vendors/email/EmailViewer.vue.d.ts +1 -1
  275. package/dist/src/package/vendors/email/index.d.ts +1 -1
  276. package/dist/src/package/vendors/model/index.d.ts +1 -1
  277. package/dist/src/package/vendors/nestedRender.d.ts +1 -1
  278. package/dist/src/package/vendors/pdf/PdfView.vue.d.ts +1 -1
  279. package/dist/src/package/vendors/pdf/index.d.ts +1 -1
  280. package/dist/src/package/vendors/pptx/index.d.ts +1 -1
  281. package/dist/src/package/vendors/renders.d.ts +1 -1
  282. package/dist/src/package/vendors/typst/TypstViewer.vue.d.ts +1 -1
  283. package/dist/src/package/vendors/typst/index.d.ts +1 -1
  284. package/dist/src/package/vendors/word/doc.d.ts +1 -1
  285. package/dist/src/package/vendors/word/docx.d.ts +1 -1
  286. package/dist/src/package/vendors/xlsx/index.d.ts +2 -2
  287. package/dist/src/package/vendors/xlsx/util.d.ts +0 -5
  288. package/package.json +25 -20
package/README.en.md ADDED
@@ -0,0 +1,373 @@
1
+ # Flyfish Viewer
2
+
3
+ [Simplified Chinese](README.md) | [English](README.en.md)
4
+
5
+ Bring Word, Excel, PowerPoint, PDF, Typst, archives, email, audio, ebooks, drawings, CAD, 3D models, Markdown, images, and source code preview into the browser with a clean, deployable viewer.
6
+
7
+ `@flyfish-group/file-viewer3` is a pure frontend file preview component built with Vue 3, TypeScript, and Vite. Vue 2.7 projects should use the matching `@flyfish-group/file-viewer` package. The Vue 3 build is also the baseline runtime for the React, vanilla JavaScript, and iframe integration packages.
8
+
9
+ The viewer does not require a backend conversion service. It is designed for OA systems, knowledge bases, attachment centers, workflow platforms, customer support portals, document approval flows, intranet systems, and offline-capable deployments where file preview should feel like a maintained product module rather than a temporary feature.
10
+
11
+ - npm for Vue 3: [@flyfish-group/file-viewer3](https://www.npmjs.com/package/@flyfish-group/file-viewer3)
12
+ - npm for Vue 2.7: [@flyfish-group/file-viewer](https://www.npmjs.com/package/@flyfish-group/file-viewer)
13
+ - npm for React: [@flyfish-group/file-viewer-react](https://www.npmjs.com/package/@flyfish-group/file-viewer-react)
14
+ - npm for vanilla JavaScript: [@flyfish-group/file-viewer-web](https://www.npmjs.com/package/@flyfish-group/file-viewer-web)
15
+ - Official documentation: [doc.flyfish.dev](https://doc.flyfish.dev)
16
+ - Online demo: [viewer.flyfish.dev](https://viewer.flyfish.dev)
17
+ - Document comparison demo: [viewer.flyfish.dev/compare.html](https://viewer.flyfish.dev/compare.html)
18
+ - GitHub artifact repository: [github.com/flyfish-dev/file-viewer](https://github.com/flyfish-dev/file-viewer)
19
+ - Gitee artifact mirror: [gitee.com/flyfish-dev/file-viewer](https://gitee.com/flyfish-dev/file-viewer)
20
+ - Source access and commercial customization: [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
21
+
22
+ ## Current Packages
23
+
24
+ | Stack | Package | Version | Recommended branch | Notes |
25
+ | --- | --- | --- | --- | --- |
26
+ | Vue 3 | `@flyfish-group/file-viewer3` | `1.0.22` | `v3` | Recommended version and the runtime baseline for React / vanilla JS iframe integrations |
27
+ | Vue 2.7 | `@flyfish-group/file-viewer` | `1.0.22` | `main` | Vue 2 compatible package with the same format coverage and API semantics |
28
+ | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.22` | adapter package | iframe component that loads `/file-viewer/index.html` by default |
29
+ | Vanilla JavaScript | `@flyfish-group/file-viewer-web` | `1.0.22` | adapter package | iframe helpers and static viewer asset copier |
30
+
31
+ For intranet or offline environments, this artifact repository also ships npm tarballs under `artifacts/`:
32
+
33
+ ```bash
34
+ npm install ./artifacts/flyfish-group-file-viewer3-1.0.22.tgz
35
+ npm install ./artifacts/flyfish-group-file-viewer-1.0.22.tgz
36
+ npm install ./artifacts/flyfish-group-file-viewer-web-1.0.22.tgz
37
+ npm install ./artifacts/flyfish-group-file-viewer-react-1.0.22.tgz
38
+ ```
39
+
40
+ When installing the React tarball offline, install the same-version web tarball first because the React package depends on `@flyfish-group/file-viewer-web`.
41
+
42
+ If you use pnpm 10 and see `Ignored build scripts: @flyfish-group/file-viewer-web`, run:
43
+
44
+ ```bash
45
+ pnpm approve-builds
46
+ ```
47
+
48
+ Then allow `@flyfish-group/file-viewer-web`, or manually copy the bundled viewer assets:
49
+
50
+ ```bash
51
+ pnpm exec file-viewer-copy-assets ./public/file-viewer
52
+ ```
53
+
54
+ ![Flyfish Viewer demo](docs/_images/demo-main.png)
55
+
56
+ ## Why Use It
57
+
58
+ - **Pure frontend and serverless.** File parsing and rendering happen in the browser. You do not need Office Server, a LibreOffice daemon, or a document conversion backend.
59
+ - **Broad format coverage.** The current release maps 149 extensions across 20 preview pipelines, including Office, PDF, OFD, Typst, archives, email, EDA files, CAD, 3D models, Excalidraw, draw.io, EPUB, UMD, Markdown, images, audio, video, and source code.
60
+ - **Lazy loaded renderers.** Heavy PDF, Office, OFD, Typst, archive, email, CAD, 3D, ebook, Markdown, and code highlighting dependencies are loaded only when the file type needs them.
61
+ - **Production-ready operations.** The viewer includes original file download, full rendered printing, rendered HTML export, watermark options, theme options, lifecycle hooks, iframe events, and before-operation guards for permission checks.
62
+ - **Better document reading.** Word and PDF keep a grey workspace, white paper surface, centered reading, width fitting, navigation, zoom, rotation, and complete print / HTML export paths.
63
+ - **Controlled theming.** `options.theme` supports `light`, `dark`, and `system`. Light business UIs can lock the viewer to `light` even when the operating system is in dark mode.
64
+ - **PDF toolbar ergonomics.** `toolbar.position` supports `auto`, `top`, and `bottom-right`. In `auto` mode, PDF uses a bottom-right floating operation bar to avoid duplicating the PDF navigation toolbar.
65
+ - **Demo and comparison views.** The repository includes the main demo and a standalone `/compare.html` page for side-by-side document comparison.
66
+ - **Component and standalone modes.** Use it as a Vue component, or deploy the static viewer and embed it through iframe in any system.
67
+ - **Artifact-first delivery.** This public repository contains minified build artifacts, static demos, documentation output, sample files, Docker deployment assets, and npm tarballs. It does not contain the private source tree.
68
+
69
+ ## Supported Formats
70
+
71
+ The viewer is organized around preview pipelines rather than one-off file extensions.
72
+
73
+ | Category | Extensions | Rendering pipeline | Typical use |
74
+ | --- | --- | --- | --- |
75
+ | Word | `docx`, `docm`, `dotx`, `dotm` | `docx-preview`, read-only page preview, print and HTML export | Modern Word documents and templates |
76
+ | Legacy Word | `doc`, `dot` | `msdoc-viewer` with Word-like paper surface and CFB tolerance fixes | Old Word 97-2003 files |
77
+ | Excel | `xlsx`, `xltx` | `styled-exceljs` plus virtual table rendering, merged cells, styles, auto text color, workbook images | Business spreadsheets and templates |
78
+ | Excel-compatible | `xlsm`, `xlsb`, `xls`, `xlt`, `xltm`, `csv`, `ods`, `fods`, `numbers` | Progressive spreadsheet parsing and virtual rendering | Legacy spreadsheets and lightweight data preview |
79
+ | PowerPoint | `pptx`, `pptm`, `potx`, `potm`, `ppsx`, `ppsm` | Slide preview with images, shapes, theme backgrounds, clipping, and EMF fallback | Presentations, training decks, proposals |
80
+ | PDF | `pdf` | `pdfjs-dist`, streaming same-origin loading, Range support, zoom, rotation, page thumbnails, outline tree, width fitting, print, HTML export | Contracts, invoices, official layout documents |
81
+ | OFD | `ofd` | Browser-side OFD preview based on `DLTech21/ofd.js` source | Chinese e-invoices, government documents, archives |
82
+ | Typst | `typ`, `typst` | Direct Typst source rendering with browser WASM compiler and SVG pages | Technical reports, papers, engineering documents |
83
+ | Archives | `zip`, `zipx`, `7z`, `rar`, `tar`, `gz`, `tgz`, `bz2`, `xz`, `zst`, `cab`, `iso`, `jar`, `apk`, `cbz`, `cbr`, and more | `libarchive.js` Worker, directory listing, lazy extraction, IndexedDB cache | Attachment packages and internal document bundles |
84
+ | Email | `eml`, `msg` | `postal-mime` for EML, `@kenjiuno/msgreader` for MSG, headers, HTML/text body, attachment preview | Email archives and support tickets |
85
+ | EDA | `olb`, `dra` | CFB-based OrCAD / Allegro structure inspection, trees, symbols, footprints, padstack candidates, properties, strings, diagnostics | Component libraries and EDA attachments |
86
+ | CAD | `dxf` | `@cadview/core` 2D CAD preview with pan, zoom, and layer controls | Engineering drawings |
87
+ | DWG compatibility | `dwg` | Detects renamed DXF when possible; extracts embedded preview for true DWG and explains conversion boundaries | Upload compatibility for CAD workflows |
88
+ | 3D models | `glb`, `gltf`, `obj`, `stl`, `ply`, `fbx`, `dae`, `3ds`, `3mf`, `amf`, `usd`, `usda`, `usdc`, `usdz`, `kmz`, `pcd`, `wrl`, `vrml`, `xyz`, `vtk`, `vtp`, `step`, `stp`, `iges`, `igs`, `ifc`, `3dm` | Three.js interactive preview, with conversion guidance for heavy CAD/BIM kernels | 3D assets, point clouds, design models |
89
+ | Excalidraw | `excalidraw` | Official `@excalidraw/excalidraw` restore and `exportToSvg` read-only rendering | Whiteboard sketches and product diagrams |
90
+ | draw.io | `drawio`, `dio` | Official diagrams.net `GraphViewer` | Flowcharts and architecture diagrams |
91
+ | EPUB | `epub` | `epubjs` table of contents and scrolling reader | Ebooks and long training materials |
92
+ | UMD ebook | `umd` | UMD metadata, chapters, offsets, zlib text blocks | Legacy mobile ebooks |
93
+ | Markdown | `md`, `markdown` | Markdown reading surface with theme-aware styles | README files and knowledge base articles |
94
+ | Images | `gif`, `jpg`, `jpeg`, `bmp`, `tiff`, `tif`, `png`, `svg`, `webp` | Native image preview | Image attachments and design assets |
95
+ | Source and text | `txt`, `json`, `js`, `mjs`, `cjs`, `css`, `java`, `py`, `html`, `htm`, `jsx`, `ts`, `tsx`, `xml`, `log`, `vue`, `yaml`, `yml`, `ini`, `sh`, `bash`, `sql`, `go`, `rs`, `php`, `c`, `cpp`, `cc`, `h`, `hpp`, `cs`, `diff` | Lightweight `highlight.js` language-specific highlighting, HTML shown as source | Logs, configs, code snippets, API responses |
96
+ | Audio | `mp3`, `mpeg`, `wav`, `ogg`, `oga`, `opus`, `m4a`, `aac`, `flac`, `weba` | Native browser audio player | Recordings and audio attachments |
97
+ | Video | `mp4` | Native browser video player | Screen recordings and demo videos |
98
+
99
+ ## Vue 3 Integration
100
+
101
+ ```bash
102
+ npm install @flyfish-group/file-viewer3
103
+ ```
104
+
105
+ ```ts
106
+ import { createApp } from 'vue'
107
+ import App from './App.vue'
108
+ import FileViewer from '@flyfish-group/file-viewer3'
109
+
110
+ createApp(App).use(FileViewer).mount('#app')
111
+ ```
112
+
113
+ ```vue
114
+ <script setup lang="ts">
115
+ import { ref } from 'vue'
116
+
117
+ const url = ref('/files/demo.pdf')
118
+
119
+ const options = {
120
+ theme: 'light',
121
+ toolbar: { position: 'bottom-right', download: true, print: true, exportHtml: true },
122
+ watermark: { text: 'Internal Preview', opacity: 0.14 },
123
+ pdf: { streaming: 'same-origin', rangeChunkSize: 64 * 1024 }
124
+ }
125
+ </script>
126
+
127
+ <template>
128
+ <div style="height: 100vh">
129
+ <file-viewer :url="url" :options="options" />
130
+ </div>
131
+ </template>
132
+ ```
133
+
134
+ For local files or authenticated downloads, pass a `File` object:
135
+
136
+ ```ts
137
+ const response = await fetch('/api/files/contract', { credentials: 'include' })
138
+ const blob = await response.blob()
139
+
140
+ file.value = new File([blob], 'contract.pdf', { type: blob.type })
141
+ ```
142
+
143
+ The filename matters. The viewer uses the extension to choose the correct rendering pipeline.
144
+
145
+ ## Vue 2.7 Integration
146
+
147
+ ```bash
148
+ npm install @flyfish-group/file-viewer
149
+ ```
150
+
151
+ ```ts
152
+ import Vue from 'vue'
153
+ import FileViewer from '@flyfish-group/file-viewer'
154
+
155
+ Vue.use(FileViewer)
156
+ ```
157
+
158
+ ```vue
159
+ <template>
160
+ <div style="height: 100vh">
161
+ <file-viewer :url="url" :options="options" />
162
+ </div>
163
+ </template>
164
+
165
+ <script>
166
+ export default {
167
+ data() {
168
+ return {
169
+ url: '/files/demo.pdf',
170
+ options: {
171
+ theme: 'light',
172
+ toolbar: { position: 'bottom-right' }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ </script>
178
+ ```
179
+
180
+ The Vue 2 and Vue 3 package lines share the same user-facing capabilities and option semantics.
181
+
182
+ ## React Integration
183
+
184
+ The React package is an iframe adapter. It reuses the Vue 3 baseline viewer that is bundled by `@flyfish-group/file-viewer-web`.
185
+
186
+ ```bash
187
+ npm install @flyfish-group/file-viewer-react
188
+ ```
189
+
190
+ ```tsx
191
+ import FileViewer from '@flyfish-group/file-viewer-react'
192
+
193
+ export function Preview() {
194
+ return (
195
+ <div style={{ height: '100vh' }}>
196
+ <FileViewer
197
+ url="/files/demo.pdf"
198
+ options={{
199
+ theme: 'light',
200
+ toolbar: { position: 'bottom-right' },
201
+ watermark: { text: 'Internal Preview', opacity: 0.14 }
202
+ }}
203
+ onViewerEvent={(event) => {
204
+ console.log(event.type, event.event, event.payload)
205
+ }}
206
+ />
207
+ </div>
208
+ )
209
+ }
210
+ ```
211
+
212
+ By default, the iframe loads `/file-viewer/index.html`. If your static assets are deployed elsewhere, pass `viewerUrl`.
213
+
214
+ ## Vanilla JavaScript Integration
215
+
216
+ ```bash
217
+ npm install @flyfish-group/file-viewer-web
218
+ ```
219
+
220
+ ```html
221
+ <div id="viewer" style="height: 100vh"></div>
222
+
223
+ <script type="module">
224
+ import { mountViewerFrame } from '@flyfish-group/file-viewer-web'
225
+
226
+ mountViewerFrame(document.getElementById('viewer'), {
227
+ url: '/files/demo.pdf',
228
+ options: {
229
+ theme: 'light',
230
+ toolbar: { position: 'bottom-right' },
231
+ archive: { workerUrl: '/file-viewer/vendor/libarchive/worker-bundle.js', cache: true }
232
+ },
233
+ onEvent(event) {
234
+ console.log(event.type, event.event, event.payload)
235
+ }
236
+ })
237
+ </script>
238
+ ```
239
+
240
+ The web package copies the static viewer into `public/file-viewer` during installation. If your package manager blocks install scripts, run:
241
+
242
+ ```bash
243
+ npx file-viewer-copy-assets ./public/file-viewer
244
+ ```
245
+
246
+ ## iframe Protocol
247
+
248
+ If you cannot use npm helpers, deploy the static viewer and pass a file URL through query parameters:
249
+
250
+ ```html
251
+ <iframe
252
+ src="/file-viewer/index.html?url=%2Ffiles%2Fdemo.pdf&options=%7B%22theme%22%3A%22light%22%2C%22toolbar%22%3A%7B%22position%22%3A%22bottom-right%22%7D%7D"
253
+ style="width: 100%; height: 100vh; border: 0"
254
+ ></iframe>
255
+ ```
256
+
257
+ For authenticated files, download the file in the host system and push a `Blob` to the iframe:
258
+
259
+ ```ts
260
+ const viewerUrl = '/file-viewer/index.html'
261
+ const viewerOrigin = location.origin
262
+ const filename = 'contract.pdf'
263
+ const options = { theme: 'light', toolbar: { position: 'bottom-right' } }
264
+ const frame = document.getElementById('viewer') as HTMLIFrameElement
265
+
266
+ frame.src =
267
+ `${viewerUrl}?name=${encodeURIComponent(filename)}` +
268
+ `&from=${encodeURIComponent(location.origin)}` +
269
+ `&options=${encodeURIComponent(JSON.stringify(options))}`
270
+
271
+ frame.onload = async () => {
272
+ const response = await fetch('/api/files/contract', { credentials: 'include' })
273
+ const blob = await response.blob()
274
+ frame.contentWindow?.postMessage(blob, viewerOrigin)
275
+ }
276
+ ```
277
+
278
+ The viewer validates `event.origin === from` and only accepts `Blob` messages from the declared origin.
279
+
280
+ ## Core Options
281
+
282
+ | Option | Description |
283
+ | --- | --- |
284
+ | `theme` | `light`, `dark`, or `system`. Default is `system`. Use `light` when embedding in a fixed light UI. |
285
+ | `toolbar` | `true`, `false`, or an object that controls download, print, HTML export, and toolbar position. |
286
+ | `toolbar.position` | `auto`, `top`, or `bottom-right`. Default `auto` floats the operation bar at bottom right for PDF and keeps other formats at top. |
287
+ | `watermark` | Text or image watermark configuration. Watermark participates in preview, print, and exported HTML. |
288
+ | `archive.workerUrl` | Custom `libarchive.js` Worker URL for private deployment. |
289
+ | `archive.cache` | Enables IndexedDB cache for extracted archive entries. |
290
+ | `archive.maxArchiveSize` | Maximum archive size allowed for directory parsing. |
291
+ | `archive.maxEntryPreviewSize` | Maximum extracted entry size allowed for online preview. |
292
+ | `pdf.streaming` | PDF URL loading strategy. Same-origin streaming is enabled by default. |
293
+ | `pdf.rangeChunkSize` | PDF.js Range request chunk size. |
294
+ | `typst.compilerWasmUrl` | Custom Typst compiler WASM URL. |
295
+ | `hooks` | Vue component lifecycle hooks for load and unload events. |
296
+ | `beforeOperation` | Vue component guard before download, print, or HTML export. Return `false` to cancel. |
297
+
298
+ React, vanilla JavaScript, and iframe integrations cannot serialize function hooks into query parameters. Use `onViewerEvent` or `onEvent` to receive lifecycle and operation events from the iframe.
299
+
300
+ ## Printing, Exporting, and Watermarks
301
+
302
+ - Download keeps the original file bytes. It does not write rendered output back into the source file.
303
+ - Print opens a print-only document containing the rendered body and watermark, without the demo shell or host UI.
304
+ - PDF print and HTML export use a dedicated adapter that renders complete pages rather than only the visible canvas.
305
+ - Word print and HTML export preserve the white paper surface and page sizing while removing preview-only layout wrappers.
306
+ - Spreadsheet, archive, email, EPUB, audio, video, and 3D pipelines hide unreliable print buttons when the full document cannot be printed consistently.
307
+ - HTML export clones the current rendered output and converts canvas content where possible.
308
+
309
+ ## Document Comparison
310
+
311
+ The production demo includes a standalone comparison page:
312
+
313
+ [https://viewer.flyfish.dev/compare.html](https://viewer.flyfish.dev/compare.html)
314
+
315
+ It supports two-pane document preview, built-in samples, URL input, local upload, swapping panes, reset, and synchronized scrolling. The comparison page is intentionally separate from the main viewer entry so that the primary component API stays small and predictable.
316
+
317
+ ## Private Deployment
318
+
319
+ For npm-based iframe integrations, make sure your final static output contains:
320
+
321
+ ```txt
322
+ file-viewer/index.html
323
+ file-viewer/assets/*
324
+ file-viewer/vendor/libarchive/worker-bundle.js
325
+ file-viewer/vendor/libarchive/libarchive.wasm
326
+ ```
327
+
328
+ The artifact repository also contains:
329
+
330
+ | Path | Purpose |
331
+ | --- | --- |
332
+ | `dist/` | Minified library build artifacts |
333
+ | `demo/` | Static production demo, including `index.html` and `compare.html` |
334
+ | `adapter-demo/` | React and vanilla JavaScript integration demo |
335
+ | `docs/` | Static documentation site output |
336
+ | `example/` | Sample files used by the demo |
337
+ | `artifacts/` | npm tarballs and packaged static build archives |
338
+ | `README.md` | Default Chinese documentation |
339
+ | `README.en.md` | English documentation |
340
+ | `LICENSE` | Apache-2.0 license |
341
+
342
+ ## Docker
343
+
344
+ The project provides a static nginx runtime image and build scripts for `linux/amd64` and `linux/arm64`. A typical deployment can serve the demo and comparison page directly:
345
+
346
+ ```bash
347
+ docker run --rm -p 8080:80 flyfishdev/file-viewer:1.0.22
348
+ ```
349
+
350
+ Then open:
351
+
352
+ ```txt
353
+ http://localhost:8080/
354
+ http://localhost:8080/compare.html
355
+ ```
356
+
357
+ If you build the image yourself, use the provided `Dockerfile` and keep the static viewer assets, examples, and vendor WASM files together.
358
+
359
+ ## Public Artifacts vs Source Code
360
+
361
+ This public repository is for artifact delivery. It contains minified build output, static demo sites, sample files, documentation output, and npm tarballs. It intentionally does not include the private source tree.
362
+
363
+ If you need source code access, second development resources, or commercial customization, use the self-service source access portal:
364
+
365
+ [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
366
+
367
+ The self-service source access price is 4.99. It is designed to make legitimate second development and commercial evaluation straightforward without mixing source delivery into the public artifact repository.
368
+
369
+ ## License and Attribution
370
+
371
+ Flyfish Viewer is distributed under the Apache-2.0 license. You may use the public artifacts according to that license.
372
+
373
+ For second development or commercial use, please keep clear attribution to Flyfish Viewer and contribute useful fixes or compatibility improvements back whenever possible. This keeps the preview ecosystem healthier for everyone using the component in real business systems.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Flyfish Viewer
2
2
 
3
+ [简体中文](README.md) | [English](README.en.md)
4
+
3
5
  把 Word、Excel、PPT、PDF、Typst、压缩包、邮件、音频和电子书稳稳带进浏览器里。
4
6
 
5
7
  `@flyfish-group/file-viewer3` 是一款基于 Vue 3、TypeScript 和 Vite 构建的纯前端文件预览组件。Vue2.7 项目请使用同能力包 `@flyfish-group/file-viewer`。两条 npm 包线保持一致的格式覆盖、示例体验和 API 语义,Vue3 构建产物作为 React、纯 Web 和其他适配层的统一预览基线。
@@ -12,25 +14,28 @@
12
14
  - npm(纯 JS): [@flyfish-group/file-viewer-web](https://www.npmjs.com/package/@flyfish-group/file-viewer-web)
13
15
  - 官方文档: [doc.flyfish.dev](https://doc.flyfish.dev)
14
16
  - 在线 Demo: [viewer.flyfish.dev](https://viewer.flyfish.dev)
15
- - 公开成品仓库: [github.com/flyfish-dev/file-viewer](https://github.com/flyfish-dev/file-viewer)
17
+ - 文档比对 Demo: [viewer.flyfish.dev/compare.html](https://viewer.flyfish.dev/compare.html)
18
+ - Docker 镜像发布目标: `flyfishdev/file-viewer:1.0.22`
19
+ - 公开成品仓库(GitHub): [github.com/flyfish-dev/file-viewer](https://github.com/flyfish-dev/file-viewer)
20
+ - 公开成品仓库(Gitee): [gitee.com/flyfish-dev/file-viewer](https://gitee.com/flyfish-dev/file-viewer)
16
21
  - 源码自助开通: [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
17
22
 
18
23
  ## 当前发布版本
19
24
 
20
25
  | 技术栈 | npm 包 | 最新版本 | 推荐分支 | 说明 |
21
26
  | --- | --- | --- | --- | --- |
22
- | Vue3 | `@flyfish-group/file-viewer3` | `1.0.20` | `v3` | 主推版本,也是 React / 纯 Web 私有化 iframe 适配层的构建基线 |
23
- | Vue2.7 | `@flyfish-group/file-viewer` | `1.0.20` | `main` | 兼容 Vue2 项目,格式能力与 Vue3 保持一致 |
24
- | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.20` | 当前仓库子工程 | iframe 组件,默认加载 `/file-viewer/index.html` |
25
- | 纯 JS | `@flyfish-group/file-viewer-web` | `1.0.20` | 当前仓库子工程 | iframe helper 和 viewer 产物复制工具 |
27
+ | Vue3 | `@flyfish-group/file-viewer3` | `1.0.22` | `v3` | 主推版本,也是 React / 纯 Web 私有化 iframe 适配层的构建基线 |
28
+ | Vue2.7 | `@flyfish-group/file-viewer` | `1.0.22` | `main` | 兼容 Vue2 项目,格式能力与 Vue3 保持一致 |
29
+ | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.22` | 当前仓库子工程 | iframe 组件,默认加载 `/file-viewer/index.html` |
30
+ | 纯 JS | `@flyfish-group/file-viewer-web` | `1.0.22` | 当前仓库子工程 | iframe helper 和 viewer 产物复制工具 |
26
31
 
27
32
  如果你在内网、离线环境,或者 npm 发布权限还没有完成配置,也可以直接使用公开成品仓库 `artifacts/` 里的 tarball。离线安装 React 包时请先安装同版本 web 包:
28
33
 
29
34
  ```bash
30
- npm install ./artifacts/flyfish-group-file-viewer3-1.0.20.tgz
31
- npm install ./artifacts/flyfish-group-file-viewer-1.0.20.tgz
32
- npm install ./artifacts/flyfish-group-file-viewer-web-1.0.20.tgz
33
- npm install ./artifacts/flyfish-group-file-viewer-react-1.0.20.tgz
35
+ npm install ./artifacts/flyfish-group-file-viewer3-1.0.22.tgz
36
+ npm install ./artifacts/flyfish-group-file-viewer-1.0.22.tgz
37
+ npm install ./artifacts/flyfish-group-file-viewer-web-1.0.22.tgz
38
+ npm install ./artifacts/flyfish-group-file-viewer-react-1.0.22.tgz
34
39
  ```
35
40
 
36
41
  Vue3、Vue2、React 和纯 JS tarball 都会随公开成品仓库一起生成。离线安装 React 包时请先安装同版本 web 包;React / 纯 JS 包推荐用 `npm install` 获得安装即复制的体验。pnpm 10 默认会拦截依赖包的 `postinstall`,如果看到 `Ignored build scripts: @flyfish-group/file-viewer-web`,请执行 `pnpm approve-builds` 允许该包,或安装后运行 `pnpm exec file-viewer-copy-assets ./public/file-viewer`。
@@ -40,28 +45,30 @@ Vue3、Vue2、React 和纯 JS tarball 都会随公开成品仓库一起生成。
40
45
  ## 为什么值得接入
41
46
 
42
47
  - **纯前端 Serverless。** 文档解析和展示全部在浏览器内完成,部署简单,不依赖 Office 服务端、LibreOffice 守护进程或额外转码链路。
43
- - **格式覆盖完整。** 当前内置 137 个扩展名映射,覆盖 Word、Excel、PowerPoint、PDF、OFD、Typst、压缩包、邮件、OLB/DRA、CAD、3D 模型、Excalidraw、draw.io、EPUB、UMD、Markdown、图片、音频、代码/文本和 MP4,能覆盖绝大多数业务附件场景。
48
+ - **格式覆盖完整。** 当前内置 149 个扩展名映射,覆盖 Word、Excel、PowerPoint、PDF、OFD、Typst、压缩包、邮件、OLB/DRA、CAD、3D 模型、Excalidraw、draw.io、EPUB、UMD、Markdown、图片、音频、代码/文本和 MP4,能覆盖绝大多数业务附件场景。
44
49
  - **按需异步加载。** PDF、OFD、Typst、压缩包、邮件、OLB/DRA、CAD、3D 模型、绘图、Office、EPUB、UMD、Markdown 和代码高亮渲染器都按需加载,重型解析依赖不会进入其他格式的首屏路径。
45
- - **预览器操作完整。** 内置下载原文件、打印完整渲染结果、导出渲染后 HTML、水印开关和水印 options;打印按钮会按当前格式和渲染链路动态显隐,Word / PDF 使用专属完整页导出适配器,不依赖当前视口,适合合同、归档和审批类场景。
50
+ - **预览器操作完整。** 内置下载原文件、打印完整渲染结果、导出渲染后 HTML、水印开关、水印 options 和主题 options;`theme` 支持 `light`、`dark`、`system`,默认跟随系统,浅色业务 UI 可显式锁定 `light`;打印按钮会按当前格式和渲染链路动态显隐,Word / PDF 使用专属完整页导出适配器,不依赖当前视口,适合合同、归档和审批类场景。
46
51
  - **集成控制更完整。** 提供加载/卸载生命周期钩子、iframe 事件回传和按钮前置校验机制,下载、打印、导出前可以接入权限验证、审计确认或业务二次弹窗。
47
52
  - **阅读体验更像产品。** `.doc`、`.docx`、PDF 都保留灰色工作台、白色纸张、居中阅读和自适应缩放;PDF 兼容旋转页和页面 / 目录导航,Excel 会尽量还原图片和自动文本色,避免“内容能打开但不好读”的落差。
48
53
  - **明暗主题有边界。** Demo 外壳、Markdown 和代码预览会适配系统暗色模式;PDF、Word、Excel 等带原始版式的内容保持独立纸张或表格背景,避免全局主题污染文档。
49
54
  - **Demo 更适合验收。** 示例文件按文档、表格、图纸、代码、图片等类型分组展示,点击样例即可打开并自动收起选择器。
55
+ - **独立文档比对入口。** 生产 Demo 额外提供 `/compare.html`,左右并排预览两份文档,支持示例、URL、本地上传、交换、重置和同步滚动,不污染主预览入口。
50
56
  - **Vue2 / Vue3 体验一致。** `main` 分支面向 Vue2.7,`v3` 分支面向 Vue3;两边共享完整格式覆盖、示例文件盒子、文档站和 iframe 集成体验。
51
57
  - **组件和独立站两用。** 既支持在 Vue 项目里直接作为组件使用,也支持独立部署后通过 iframe 嵌入到任意系统,方便多业务线复用。
58
+ - **Docker 一键部署。** 提供 nginx 静态镜像、`Dockerfile` 和 buildx 发布脚本,发布镜像覆盖 `linux/amd64` 与 `linux/arm64`。
52
59
  - **适合成品交付。** 公开成品仓库、混淆压缩产物、npm tarball、静态部署产物和私有化 iframe 适配包都一起维护,便于下载、验收和二次接入。
53
60
 
54
61
  ## 支持格式
55
62
 
56
- 当前版本内置 137 个扩展名映射,覆盖 20 条预览链路。
63
+ 当前版本内置 149 个扩展名映射,覆盖 20 条预览链路。
57
64
 
58
65
  | 类别 | 扩展名 | 当前表现 | 适合场景 |
59
66
  | --- | --- | --- | --- |
60
- | Word | `docx` | `docx-preview`,更适合保留文档结构和版式 | 新生成的 Word 文档、正式文档 |
61
- | Word | `doc` | `msdoc-viewer` + Word 风格页面容器,增强 CFB 容错和表格布局 | 历史 `.doc` 老文档 |
62
- | Excel | `xlsx` | `styled-exceljs` + 虚拟滚动,支持尺寸、合并、常见样式、自动文本色和 workbook drawing 图片;打印按钮按能力隐藏,避免只打印当前视口 | 需要保留表格结构和样式的业务 |
63
- | Excel 兼容格式 | `xlsm`、`xlsb`、`xls`、`csv`、`ods`、`fods`、`numbers` | 统一解析,按格式可用信息渐进还原样式;同样遵循虚拟表格打印边界 | 老表格、轻量数据查看 |
64
- | PowerPoint | `pptx` | 浏览幻灯片内容,增强组合图形、主题背景、图片裁剪与 EMF 矢量图预览 | 汇报材料、课件、方案 |
67
+ | Word | `docx`、`docm`、`dotx`、`dotm` | `docx-preview`,更适合保留文档结构和版式,模板/宏格式按只读预览处理 | 新生成的 Word 文档、正式文档、Word 模板 |
68
+ | Word | `doc`、`dot` | `msdoc-viewer` + Word 风格页面容器,增强 CFB 容错和表格布局 | 历史 `.doc` 老文档、Word 97-2003 模板 |
69
+ | Excel | `xlsx`、`xltx` | `styled-exceljs` + 虚拟滚动,支持尺寸、合并、常见样式、自动文本色和 workbook drawing 图片;打印按钮按能力隐藏,避免只打印当前视口 | 需要保留表格结构和样式的业务、Excel 模板 |
70
+ | Excel 兼容格式 | `xlsm`、`xlsb`、`xls`、`xlt`、`xltm`、`csv`、`ods`、`fods`、`numbers` | 统一解析,按格式可用信息渐进还原样式;同样遵循虚拟表格打印边界 | 老表格、轻量数据查看 |
71
+ | PowerPoint | `pptx`、`pptm`、`potx`、`potm`、`ppsx`、`ppsm` | 浏览幻灯片内容,增强组合图形、主题背景、图片裁剪与 EMF 矢量图预览 | 汇报材料、课件、方案、演示模板 |
65
72
  | PDF | `pdf` | 基于 `pdfjs-dist` 预览,同源 URL 默认渐进读取;服务端支持 Range 时自动分片加载,支持缩放工具栏、旋转页、页侧边栏/目录树侧边栏切换、宽度自适应、完整打印和导出 HTML | 合同、票据、版式成品 |
66
73
  | OFD | `ofd` | 基于 `DLTech21/ofd.js` 仓库源码在线预览国产版式文档,避开 npm dist 授权 wasm 分支 | 电子发票、公文、归档材料 |
67
74
  | Typst | `typ`、`typst` | 直接读取 Typst 源文件,按需加载 `@myriaddreamin/typst.ts` 浏览器 WASM 编译器并按页 SVG 渲染;支持完整预览、打印和导出 HTML | 技术报告、论文草稿、工程文档模板 |
@@ -174,8 +181,8 @@ React 与纯 Web 适配层不再复制渲染器,只通过 iframe 加载 Vue3
174
181
  官网 Demo 可用于快速验证预览效果,但 React / 纯 JS 组件不会把官网 Demo 地址作为内置 viewer 地址。
175
182
 
176
183
  ```bash
177
- npm install @flyfish-group/file-viewer-react@1.0.20
178
- npm install @flyfish-group/file-viewer-web@1.0.20
184
+ npm install @flyfish-group/file-viewer-react@1.0.22
185
+ npm install @flyfish-group/file-viewer-web@1.0.22
179
186
  ```
180
187
 
181
188
  ```tsx
@@ -192,7 +199,7 @@ export function Preview() {
192
199
  }
193
200
  ```
194
201
 
195
- `@flyfish-group/file-viewer-react` 支持 React 17 / 18 / 19,内部复用 `@flyfish-group/file-viewer-web` 的 iframe 协议工具。鉴权文件仍建议由宿主系统先下载成 `Blob`,再用 `file` + `name` 推送给预览器。静态目录不是 `public/file-viewer` 时,可以运行 `npx file-viewer-copy-assets ./public/vendor/file-viewer` 并覆盖 `viewerUrl="/vendor/file-viewer/index.html"`。
202
+ `@flyfish-group/file-viewer-react` 支持 React 17 / 18 / 19,内部复用 `@flyfish-group/file-viewer-web` 的 iframe 协议工具。鉴权文件仍建议由宿主系统先下载成 `Blob`,再用 `file` + `name` 推送给预览器。静态目录不是 `public/file-viewer` 时,可以运行 `npx file-viewer-copy-assets ./public/vendor/file-viewer`,并覆盖 `viewerUrl="/vendor/file-viewer/index.html"`。helper 会默认追加 `__flyfish_viewer_version`,避免旧入口 HTML 缓存继续引用已经不存在的 hash chunk。
196
203
 
197
204
  本仓库内置了一个私有化适配层演示应用,覆盖 React 组件和纯 Web helper 两种入口。调试时直接运行:
198
205
 
@@ -200,18 +207,43 @@ export function Preview() {
200
207
  pnpm dev:adapters
201
208
  ```
202
209
 
203
- 它会先构建并同步 Vue3 基线预览器到演示应用的 `public/file-viewer`,打开本地地址即可看到预览效果。验证静态部署产物时运行:
210
+ 它会先构建并同步 Vue3 基线预览器到演示应用的 `public/file-viewer` 和 `public/vendor/file-viewer`,打开本地地址即可同时验证 React 组件和纯 JS `mountViewerFrame` 在自定义子路径下的 DOCX 预览效果。验证静态部署产物时运行:
204
211
 
205
212
  ```bash
206
213
  pnpm build:adapter-demo
207
214
  pnpm --filter @flyfish-group/file-viewer-demo preview
208
215
  ```
209
216
 
210
- 确认无误后,`packages/demo/dist` 可以作为普通静态目录部署;其中已经包含 `file-viewer/index.html` 和演示文件。
217
+ 确认无误后,`packages/demo/dist` 可以作为普通静态目录部署;其中已经包含 `file-viewer/index.html`、`vendor/file-viewer/index.html` 和演示文件。
218
+
219
+ ### 5. Docker 一键部署
220
+
221
+ 适合内网、私有云、客户现场或希望直接运行完整 Demo 的场景。镜像发布后可直接运行:
222
+
223
+ ```bash
224
+ docker run -d \
225
+ --name flyfish-viewer \
226
+ --restart unless-stopped \
227
+ -p 8080:80 \
228
+ flyfishdev/file-viewer:1.0.22
229
+ ```
230
+
231
+ 访问:
232
+
233
+ - 主预览: `http://localhost:8080/`
234
+ - 文档比对: `http://localhost:8080/compare.html`
235
+
236
+ 源码仓库内也提供 `Dockerfile`,本地构建运行:
237
+
238
+ ```bash
239
+ pnpm docker:build
240
+ docker run --rm -p 8080:80 flyfishdev/file-viewer:1.0.22
241
+ ```
211
242
 
212
243
  ## 使用说明
213
244
 
214
245
  - 组件支持两条主要输入路径: `url?: string` 与 `file?: File`
246
+ - 独立文档比对页位于 `/compare.html`,可通过 `?left=/example/test.doc&right=/example/word.docx` 预置左右文件;它只做视觉并排预览,不做语义 diff,完整说明见 [Demo 文档](docs/guide/demo.md#文档比对页)
215
247
  - 当 `file` 和 `url` 同时存在时,会优先渲染 `file`
216
248
  - 如果业务侧拿到的是 `Blob` 或 `ArrayBuffer`,推荐先包装成带扩展名的 `File`
217
249
  - 预览器会填满父容器,请为父容器提供稳定高度
@@ -219,7 +251,7 @@ pnpm --filter @flyfish-group/file-viewer-demo preview
219
251
  - 如果下载地址本身没有明确扩展名,建议先在业务侧取回文件,再包装成 `File`
220
252
  - PPTX 渲染器会尽量还原常见组合图形、旋转/翻转、主题背景、图片裁剪和 EMF 矢量图片;复杂 Office 特效仍建议用真实业务文件做回归
221
253
  - OFD、Typst、压缩包、邮件、OLB/DRA、CAD、3D 模型、绘图、EPUB、UMD、PDF、Office、Markdown、音频和代码高亮渲染器都按需异步加载,只有命中格式时才拉取对应代码块;Typst compiler WASM 可通过 `options.typst.compilerWasmUrl` 指向自托管地址,默认仅在打开 `.typ` / `.typst` 时加载
222
- - `options.watermark` 支持文字或图片水印;`options.toolbar` 可控制下载原文件、打印完整渲染结果和导出 HTML;`options.hooks` 可接收加载/卸载生命周期;`options.beforeOperation` 可在下载、打印、导出前做权限校验;打印按钮会结合当前文件类型、渲染完成状态和导出适配器动态显隐,Word / PDF 会生成完整页面,Excel 等虚拟表格会隐藏打印按钮,避免只打印当前视口或第一页
254
+ - `options.theme` 支持 `light`、`dark`、`system`,默认继续跟随系统;`options.watermark` 支持文字或图片水印;`options.toolbar` 可控制下载原文件、打印完整渲染结果、导出 HTML 和操作栏位置,`toolbar.position` 支持 `auto`、`top`、`bottom-right`,PDF 默认悬浮到右下角以避开自身导航栏;`options.hooks` 可接收加载/卸载生命周期;`options.beforeOperation` 可在下载、打印、导出前做权限校验;打印按钮会结合当前文件类型、渲染完成状态和导出适配器动态显隐,Word / PDF 会生成完整页面,Excel 等虚拟表格会隐藏打印按钮,避免只打印当前视口或第一页
223
255
 
224
256
  ```ts
225
257
  const blob = await response.blob()
@@ -228,7 +260,7 @@ const file = new File([blob], 'contract.pdf', { type: blob.type })
228
260
 
229
261
  ## 本地开发
230
262
 
231
- 下面的命令适用于源码开通后的完整项目。公开 GitHub 成品仓库不包含源码目录,普通用户建议直接通过 npm、`dist/` 或 `artifacts/` 里的 tarball 使用。
263
+ 下面的命令适用于源码开通后的完整项目。公开 GitHub / Gitee 成品仓库不包含源码目录,普通用户建议直接通过 npm、`dist/` 或 `artifacts/` 里的 tarball 使用。
232
264
 
233
265
  ```bash
234
266
  pnpm install
@@ -244,6 +276,8 @@ pnpm dev
244
276
  - `pnpm type-check`: 执行 TypeScript 类型检查
245
277
  - `pnpm dev:adapters`: 启动 React + 纯 JS 适配层 Demo
246
278
  - `pnpm build:adapter-demo`: 构建适配层 Demo
279
+ - `pnpm docker:build`: 构建本机架构 Docker 镜像
280
+ - `pnpm docker:publish`: 推送 Docker Hub `linux/amd64` / `linux/arm64` 多架构镜像;可通过 `DOCKER_IMAGE` 替换命名空间
247
281
  - `pnpm release:adapters:pack`: 打包 React / 纯 JS npm tarball
248
282
 
249
283
  ## 打包发布
@@ -299,7 +333,7 @@ npm publish --access public
299
333
 
300
334
  如果 npm 账号启用了 MFA,请使用交互式终端完成浏览器确认后再等待发布结果。
301
335
 
302
- 公开 GitHub 仓库只提交可直接使用的构建产物、示例、文档和 npm tarball,不提交当前源码目录。需要源码、二开包或商业自助开通的用户,可以前往 [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop),付费 4.99 后自助开通。
336
+ 公开 GitHub / Gitee 成品仓库只提交可直接使用的构建产物、示例、文档和 npm tarball,不提交当前源码目录。需要源码、二开包或商业自助开通的用户,可以前往 [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop),付费 4.99 后自助开通。
303
337
 
304
338
  ## 文档导航
305
339
 
@@ -309,6 +343,7 @@ npm publish --access public
309
343
  - [组件用法](docs/guide/usage.md)
310
344
  - [支持格式](docs/guide/formats.md)
311
345
  - [本地开发与打包](docs/guide/development.md)
346
+ - [Docker 部署](docs/guide/docker.md)
312
347
 
313
348
  ## 开源说明
314
349