askbot-dragon 1.8.35-beta → 1.8.36-beta

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.
@@ -0,0 +1,225 @@
1
+ <template>
2
+ <div class="vue-office-pdf">
3
+ <div class="vue-office-pdf-main" id="vue-office-pdf-main" ref="rootRef"></div>
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import _ from "lodash";
9
+
10
+ const pdfjsLib = window['pdfjsLib']
11
+ if(pdfjsLib) {
12
+ pdfjsLib.GlobalWorkerOptions.workerSrc = window['pdfjs-dist/build/pdf.worker']
13
+ }
14
+ const { TextLayerBuilder } = window['pdfjs-dist/web/pdf_viewer']
15
+ import waterMark from "@/utils/common";
16
+ import { mapGetters } from 'vuex'
17
+ import { setTimestamp } from '@/assets/js/common'
18
+ export default {
19
+ name: "vuePdf",
20
+ data(){
21
+ return{
22
+ loadingTask:null,
23
+ transport:null,
24
+ numPages:0,
25
+ pdfDoc:null,
26
+ lazySize:3,
27
+ scale:1
28
+ }
29
+ },
30
+ props:{
31
+ src:{
32
+ type:String,
33
+ default:""
34
+ },
35
+ editType:{
36
+ type:String,
37
+ default:""
38
+ }
39
+ },
40
+ computed:{
41
+ ...mapGetters('knowledge', {
42
+ textWatermarkStr: 'getTextWatermarkStr'
43
+ }),
44
+ },
45
+ methods:{
46
+ async init(){
47
+ //将文件转换成blob解决pdfjs引起浏览器崩溃的问题测试
48
+ let src = this.src
49
+ if (this.editType !== 'copyNewVersion'){
50
+ // src += '?timestamp=' + new Date().getTime();
51
+ src = setTimestamp(src)
52
+ }
53
+ this.loadingTask = pdfjsLib.getDocument(src);
54
+ this.loadingTask.promise.then(async pdf => {
55
+ // 获取PDF的第一页
56
+ this.pdfDoc = pdf;
57
+ this.transport = pdf._transport;
58
+ // this.numPages = pdf._transport.numPages;
59
+ this.lazySize = pdf._transport.numPages;
60
+ this.numPages = Math.min(pdf._transport.numPages, this.lazySize);
61
+ setTimeout(() => {
62
+ this._renderPage(1);
63
+ })
64
+ })
65
+ },
66
+ async _renderPage(num){
67
+ await this.pdfDoc.getPage(num).then(async page => {
68
+ let pageMain = document.getElementById('vue-office-pdf-main');
69
+ const pageDom = document.createElement('div');
70
+ let id = 'pdf-canvas-' + num;
71
+ pageDom.setAttribute('id', id);
72
+ pageDom.setAttribute('class', 'pdf-page');
73
+
74
+ const canvas = document.createElement('canvas');
75
+ const context = canvas.getContext('2d');
76
+ let pdfWidth = page.getViewport({ scale: 1}).width
77
+ const viewport = page.getViewport({ scale: this.calculateScale(pdfWidth) });
78
+ // const viewport = page.getViewport({ scale: 2 })
79
+ let outputScale = this.calculateScale(pdfWidth);
80
+
81
+ canvas.width = Math.floor(viewport.width * outputScale);
82
+ canvas.height = Math.floor(viewport.height * outputScale);
83
+
84
+ let domWidth = Math.floor(viewport.width);
85
+ let domHeight = Math.floor(viewport.height);
86
+
87
+ let wrapperWidth = 0
88
+ if (document.getElementById('vue-office-pdf-main')){
89
+ wrapperWidth = document.getElementById('vue-office-pdf-main').clientWidth - 20
90
+ }
91
+
92
+ if (domWidth > wrapperWidth){
93
+ let scale = wrapperWidth / domWidth;
94
+ domWidth = Math.floor(wrapperWidth);
95
+ domHeight = Math.floor(viewport.height * scale);
96
+ }
97
+ // 根据缩放比例调整canvas大小
98
+
99
+ canvas.style.width = domWidth + 'px';
100
+ canvas.style.height = domHeight + 'px';
101
+
102
+ pageDom.style.width = domWidth + 'px';
103
+ pageDom.style.height = domHeight + 'px';
104
+ pageDom.style.position = 'relative';
105
+ pageDom.style.marginBottom = '10px'
106
+ pageDom.style.marginLeft = 'auto';
107
+ pageDom.style.marginRight = 'auto';
108
+ pageDom.style.backgroundColor = "#ffffff";
109
+ pageDom.style.boxShadow = "0px 0px 18px 0px rgba(29, 55, 129, 0.07)"
110
+ pageDom.appendChild(canvas);
111
+
112
+ const transform = outputScale !== 1
113
+ ? [outputScale, 0, 0, outputScale, 0, 0]
114
+ : null;
115
+
116
+ await page.render({
117
+ canvasContext: context,
118
+ transform:transform,
119
+ viewport:viewport
120
+ }).promise.then(() => {
121
+ return page.getTextContent()
122
+ }).then(async (textContent) => {
123
+ // // 渲染PDF页面到canvas上
124
+
125
+ // var textlayerDiv = document.createElement("div");
126
+ // textlayerDiv.setAttribute('class', 'textLayer');
127
+ // let textlayer = new TextLayerBuilder({
128
+ // textLayerDiv: textlayerDiv,
129
+ // viewport: viewport,
130
+ // });
131
+ //
132
+ // textlayer.setTextContent(textContent);
133
+ // textlayer.render();
134
+ // pageDom.appendChild(textlayerDiv);
135
+ //
136
+ // pageMain.appendChild(pageDom);
137
+
138
+ const textDiv = document.createElement('div');
139
+ textDiv.setAttribute('class', 'textLayer');
140
+ let textLayer = new TextLayerBuilder({
141
+ textLayerDiv: textDiv,
142
+ viewport: viewport,
143
+ transform:transform,
144
+ });
145
+ textDiv.style.width = domWidth + 'px'; // 根据 viewport 调整宽度
146
+ textDiv.style.height = domHeight + 'px'; // 根据 viewport 调整高度(可能需要根据实际文本内容调整)
147
+ textDiv.style.overflow = 'hidden'; // 如果文本内容超出范围,则隐藏它
148
+ textDiv.style.whiteSpace = 'pre-wrap'; // 保留空白符和换行符
149
+ textDiv.style.position = 'absolute'; // 绝对定位以覆盖 canvas
150
+ textDiv.style.top = '0';
151
+ textDiv.style.left = '0';
152
+ // textDiv.textContent = textContent; // 设置文本内容
153
+ textLayer.setTextContent(textContent);
154
+ textLayer.render()
155
+ // 将文本 div 添加到覆盖层中
156
+ pageDom.appendChild(textDiv);
157
+
158
+ pageMain.appendChild(pageDom);
159
+ if (this.textWatermarkStr){
160
+ if(sessionStorage.getItem('isWeChat') == true || sessionStorage.getItem('isWeChat') == 'true') {
161
+ let str = `<ww-open-data type="userName" openid=${this.textWatermarkStr}></ww-open-data>`
162
+ waterMark.newInitWaterMark(id,str)
163
+ } else {
164
+ waterMark.newInitWaterMark(id,this.textWatermarkStr)
165
+ }
166
+ }
167
+ });
168
+ // pageMain.appendChild(pageDom);
169
+ if (this.numPages > num){
170
+ this._renderPage(num + 1)
171
+ }
172
+ })
173
+ },
174
+ calculateScale(pdfWidth) {
175
+ const containerWidth = document.getElementById('vue-office-pdf-main').clientWidth;
176
+ return (containerWidth / pdfWidth) * this.scale;
177
+ },
178
+ onScrollPdf: _.debounce(function (e, that) {
179
+ const { scrollTop, scrollHeight, clientHeight } = e.target;
180
+ if (scrollTop + clientHeight >= scrollHeight) {
181
+ if (that.numPages >= that.pdfDoc._transport.numPages) {
182
+ return;
183
+ }
184
+ let oldNum = that.numPages;
185
+ that.numPages = Math.min(that.pdfDoc._transport.numPages, oldNum + that.lazySize);
186
+ if (that.numPages > oldNum) {
187
+ that._renderPage(oldNum + 1);
188
+ }
189
+ }
190
+ }, 200),
191
+ },
192
+ mounted() {
193
+ this.init();
194
+ document.getElementById('KnowledgePreview').addEventListener('scroll',(e) => {
195
+ this.onScrollPdf(e,this)
196
+ })
197
+ },
198
+ destroyed() {
199
+ if (this.pdfDoc){
200
+ this.pdfDoc.destroy()
201
+ }
202
+ }
203
+ };
204
+ </script>
205
+
206
+ <style scoped lang="less">
207
+ .vue-office-pdf{
208
+ //height: 100%;
209
+ .vue-office-pdf-main{
210
+ //height: calc(100% - 20px);
211
+ //overflow-y: scroll;
212
+ //background: #ededf0;
213
+ //background: #ffffff;
214
+ //padding: 10px 0;
215
+ position: relative;
216
+ .pdf-page{
217
+ background: #ffffff;
218
+ box-shadow: 0px 0px 18px 0px rgba(29, 55, 129, 0.07)!important;
219
+ /deep/.textLayer{
220
+ opacity: 1;
221
+ }
222
+ }
223
+ }
224
+ }
225
+ </style>