ViewerDocxFromFile.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <div class="doc-container" ref="box"></div>
  3. <div class="loading-doc-box" v-if="load_status === 2">
  4. <div class="loading-spin">
  5. <a-spin :size="36" />
  6. </div>
  7. </div>
  8. <div class="loading-doc-box" v-if="load_status === 4">
  9. <a-result status="error" title="文档加载出错">
  10. <template #subtitle>
  11. {{ load_msg }}
  12. </template>
  13. </a-result>
  14. </div>
  15. </template>
  16. <script setup>
  17. import { ref, useTemplateRef, onMounted } from 'vue';
  18. import { renderDocxByBlob } from '../../3rd-libs/docx-preview';
  19. /**
  20. * 预览file中文件
  21. * 本地上传文件时可以预览
  22. */
  23. const props = defineProps({
  24. /**
  25. * 文件
  26. */
  27. file: Object,
  28. /**
  29. * 文档容器的宽度
  30. */
  31. doc_width: Number
  32. });
  33. const box = useTemplateRef('box');
  34. /**
  35. * 记录PDF文档加载过程中的状态
  36. * 1 默认值,未开始加载
  37. * 2 正在加载中
  38. * 3 加载成功
  39. * 4 加载出错
  40. */
  41. const load_status = ref(1); // 1 默认值,未启动 2 加载中 3 成功 5 出错
  42. const load_msg = ref(''); // 加载消息
  43. onMounted(() => {
  44. load_status.value = 2; // 加载中
  45. load_msg.value = 'loading';
  46. renderDocxByBlob(box.value, props.file)
  47. .then((res) => {
  48. // 所有页面都加载完毕,结束加载状态
  49. load_status.value = 3; // 加载成功
  50. load_msg.value = 'success';
  51. })
  52. .catch((err) => {
  53. load_status.value = 4; // 加载出错
  54. load_msg.value = `文档 ${props.url} 加载出错。 ERROR: :${err.message}`;
  55. });
  56. });
  57. </script>
  58. <style scoped>
  59. .doc-container {
  60. text-align: center;
  61. /* height: 100vh; */
  62. height: 100%;
  63. overflow-y: auto;
  64. }
  65. .loading-doc-box {
  66. width: 100%;
  67. /* height: 100vh; */
  68. height: 100%;
  69. display: flex;
  70. text-align: center;
  71. justify-content: center;
  72. align-items: center;
  73. position: absolute;
  74. top: 0;
  75. left: 0;
  76. background-color: #fff;
  77. }
  78. .loading-spin {
  79. width: 40px;
  80. height: 40px;
  81. }
  82. </style>