ViewerDocxFromUrl.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. import { url2Blob } from '../../utils/file-utils';
  20. const props = defineProps({
  21. /**
  22. * doc的链接
  23. */
  24. url: String,
  25. /**
  26. * 文档容器的宽度
  27. */
  28. doc_width: Number
  29. });
  30. const box = useTemplateRef('box');
  31. /**
  32. * 记录PDF文档加载过程中的状态
  33. * 1 默认值,未开始加载
  34. * 2 正在加载中
  35. * 3 加载成功
  36. * 4 加载出错
  37. */
  38. const load_status = ref(1); // 1 默认值,未启动 2 加载中 3 成功 5 出错
  39. const load_msg = ref(''); // 加载消息
  40. onMounted(() => {
  41. load_status.value = 2; // 加载中
  42. load_msg.value = 'loading';
  43. url2Blob(props.url)
  44. .then((blob) => {
  45. renderDocxByBlob(box.value, blob)
  46. .then((res) => {
  47. // console.log(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. .catch((err) => {
  58. load_status.value = 4; // 加载出错
  59. load_msg.value = `文档 ${props.url} 加载出错。 ERROR: :${err.message}`;
  60. });
  61. });
  62. </script>
  63. <style scoped>
  64. .doc-container {
  65. text-align: center;
  66. /* height: 100vh; */
  67. height: 100%;
  68. overflow-y: auto;
  69. }
  70. .loading-doc-box {
  71. width: 100%;
  72. /* height: 100vh; */
  73. height: 100%;
  74. display: flex;
  75. text-align: center;
  76. justify-content: center;
  77. align-items: center;
  78. position: absolute;
  79. top: 0;
  80. left: 0;
  81. background-color: #fff;
  82. }
  83. .loading-spin {
  84. width: 40px;
  85. height: 40px;
  86. }
  87. </style>