@toolspack/ttd-pdfjs 0.0.9 → 0.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolspack/ttd-pdfjs",
3
- "version": "0.0.9",
3
+ "version": "0.1.0",
4
4
  "private": false,
5
5
  "main": "lib/ttd-pdfjs.umd.min.js",
6
6
  "scripts": {
@@ -22,9 +22,9 @@
22
22
  },
23
23
  "devDependencies": {
24
24
  "@babel/plugin-proposal-class-properties": "^7.18.6",
25
- "@vue/cli-plugin-babel": "~4.5.0",
25
+ "@vue/cli-plugin-babel": "~4.5.11",
26
26
  "@vue/cli-plugin-eslint": "~4.5.11",
27
- "@vue/cli-service": "~4.5.0",
27
+ "@vue/cli-service": "^4.5.11",
28
28
  "@vue/eslint-config-airbnb": "^5.3.0",
29
29
  "babel-eslint": "^10.1.0",
30
30
  "babel-plugin-component": "^1.1.1",
@@ -1,7 +1,9 @@
1
1
  <template>
2
2
  <div class="pdf-view">
3
3
  <div class="pdf-view-control" v-if="showPages">
4
- <switch-page ref="switchPage" @page="onChangePage" :numPages="page_count"></switch-page>
4
+ <switch-page ref="switchPage" :scale='compuscale' :rotate="compuRotate" :numPages="page_count"
5
+ :gage="page" :zoomEnable="zoomEnable" :rotateEnable="rotateEnable"
6
+ @page="onChangePage" @zoom="onScale" @rotate="onRotate"></switch-page>
5
7
  </div>
6
8
  <div class="pdf-view-area-wapper">
7
9
  <div :style="style">
@@ -9,12 +11,13 @@
9
11
  class="center pdf-view-area"
10
12
  @drop="onDrop"
11
13
  @dragover="onDragOver"
14
+ :key="pdfurl"
12
15
  :style="{'border': border?'1px solid #666': ''}"
13
16
  v-if="pdfurl"
14
17
  >
15
18
  <div v-if="fileLoading" class="pdf-view-loading">文件加载中...</div>
16
- <!-- <div v-else-if="pageRendering" class="pdf-view-rendering">内容渲染中...</div> -->
17
- <canvas class="canvasstyle" ref="canvas"></canvas>
19
+ <div v-else-if="pageRendering" class="pdf-view-rendering">内容渲染中...</div>
20
+ <canvas :key="pdfurl +'canvas'" class="canvasstyle" ref="canvas"></canvas>
18
21
  <div class="label-area">
19
22
  <slot></slot>
20
23
  </div>
@@ -56,6 +59,7 @@ if (getChromeVersion()) {
56
59
  const PDFJS = require('pdfjs-dist')
57
60
 
58
61
  const defautScale = 1.0
62
+ const defaultRotate = 0
59
63
  // PDFJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/legacy/build/pdf.worker.min.js')
60
64
  PDFJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.min.js')
61
65
  // https://unpkg.com/pdfjs-dist@2.16.105/cmaps/
@@ -64,6 +68,9 @@ PDFJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.min.j
64
68
 
65
69
  const cMapUrl = 'https://wsp.totodi.com/staticfiles_web/web/pdfjs/cmaps/'
66
70
 
71
+ export const maxscale = 3
72
+ export const minscale = 0.2
73
+
67
74
  export default {
68
75
  components: { SwitchPage },
69
76
  props: {
@@ -74,10 +81,23 @@ export default {
74
81
  type: Number,
75
82
  default: defautScale,
76
83
  },
84
+
85
+ rotate: {
86
+ type: Number,
87
+ default: defaultRotate,
88
+ },
77
89
  showPages: {
78
90
  type: [String, Number, Boolean],
79
91
  default: true,
80
92
  },
93
+ zoomEnable: {
94
+ type: [String, Number, Boolean],
95
+ default: false,
96
+ },
97
+ rotateEnable: {
98
+ type: [String, Number, Boolean],
99
+ default: false,
100
+ },
81
101
  border: {
82
102
  type: [String, Number, Boolean],
83
103
  default: true,
@@ -104,9 +124,10 @@ export default {
104
124
  fileLoading: true,
105
125
  pageNumPending: null,
106
126
  compuscale: defautScale, // 放大倍数
127
+ compuRotate: 0, // 实际旋转度数
107
128
  page_count: 0, // 总页数
108
- maxscale: 1.5, // 最大放大倍数
109
- minscale: 0.8, // 最小放大倍数
129
+ maxscale, // 最大放大倍数
130
+ minscale, // 最小放大倍数
110
131
  isready: false,
111
132
  initPage: true, // 初始化页面
112
133
  style: {
@@ -117,57 +138,67 @@ export default {
117
138
  },
118
139
  methods: {
119
140
  async renderPage(num) {
141
+ console.log('renderPage ', this.pageRendering)
142
+ if (this.pageRendering) {
143
+ this.pageNumPending = num;
144
+ } else {
120
145
  // 渲染pdf
121
- const vm = this
122
- this.pageRendering = true
123
- // Using promise to fetch the page
124
- try {
125
- const page = await this.pdfDoc.getPage(num)
126
- let scaleNum = vm.compuscale
127
- let viewport = ''
128
- const viewboxWidth = this.showWidth
129
- if (this.initPage && viewboxWidth) {
130
- const desiredWidth = parseInt(viewboxWidth, 10) - 2
131
- // 首先获得pdf 原本宽度,然后根据showWidth 计算缩放倍数
132
- viewport = page.getViewport({ scale: 1.0 })
133
- scaleNum = desiredWidth / viewport.width
134
- this.initPage = false
135
- this.compuscale = scaleNum
136
- this.maxscale = scaleNum
146
+ const vm = this
147
+ this.pageRendering = true
148
+ // Using promise to fetch the page
149
+ if (!this.pdfDoc) {
150
+ return false
137
151
  }
138
- // 重新渲染 缩放过的PDF
139
- viewport = page.getViewport({ scale: scaleNum })
140
- this.viewport = viewport
152
+ try {
153
+ const page = await this.pdfDoc.getPage(num)
154
+ let scaleNum = vm.compuscale
155
+ let viewport = ''
156
+ const viewboxWidth = this.showWidth
157
+ if (this.initPage && viewboxWidth) {
158
+ const desiredWidth = parseInt(viewboxWidth, 10) - 2
159
+ // 首先获得pdf 原本宽度,然后根据showWidth 计算缩放倍数
160
+ viewport = page.getViewport({ scale: 1.0 })
161
+ scaleNum = desiredWidth / viewport.width
162
+ this.initPage = false
163
+ this.compuscale = scaleNum
164
+ this.maxscale = scaleNum
165
+ }
166
+ // 重新渲染 缩放过的PDF
167
+ viewport = page.getViewport({ scale: scaleNum, rotation: this.compuRotate })
168
+ this.viewport = viewport
141
169
 
142
- // 将 canvas 尺寸 传给父组件
143
- this.$emit('size', viewport, num)
170
+ // 将 canvas 尺寸 传给父组件
171
+ this.$emit('size', viewport, num)
144
172
 
145
- // Render PDF page into canvas context
146
- vm.isready = true
173
+ // Render PDF page into canvas context
174
+ vm.isready = true
147
175
 
148
- const { canvas } = vm.$refs
176
+ const { canvas } = vm.$refs
149
177
 
150
- this.style.width = `${viewport.width + 2}px`;
151
- canvas.height = viewport.height
152
- canvas.width = viewport.width
178
+ this.style.width = `${viewport.width + 2}px`;
179
+ canvas.height = viewport.height
180
+ canvas.width = viewport.width
153
181
 
154
- const renderContext = {
155
- canvasContext: canvas.getContext('2d'),
156
- viewport,
157
- }
158
- // Wait for rendering to finish
159
- await page.render(renderContext).promise
160
- vm.pageRendering = false
161
- if (vm.pageNumPending !== null) {
182
+ const renderContext = {
183
+ canvasContext: canvas.getContext('2d'),
184
+ viewport,
185
+ }
186
+ // Wait for rendering to finish
187
+ await page.render(renderContext).promise
188
+ // console.log(' await page.render 168')
189
+ vm.pageRendering = false
190
+ if (vm.pageNumPending !== null) {
162
191
  // New page rendering is pending
163
- vm.renderPage(vm.pageNumPending)
164
- vm.pageNumPending = null
192
+ vm.renderPage(vm.pageNumPending)
193
+ vm.pageNumPending = null
194
+ }
195
+ this.$emit('renderSuccess')
196
+ } catch (error) {
197
+ console.error(error)
198
+ } finally {
199
+ // console.log('finally 178')
200
+ this.pageRendering = false
165
201
  }
166
- this.$emit('renderSuccess')
167
- } catch (error) {
168
- console.error(error)
169
- } finally {
170
- this.pageRendering = false
171
202
  }
172
203
  },
173
204
  prev() {
@@ -206,13 +237,15 @@ export default {
206
237
  }
207
238
  this.viewport = null
208
239
  this.pdfDoc.destroy();
240
+ // console.log('closepdf end')
209
241
  }
210
- this.pdfDoc = null
242
+ // this.pdfDoc = null
211
243
  this.isready = false
212
244
  this.compuscale = this.scale
213
245
  this.$emit('closepdf')
214
246
  },
215
247
  queueRenderPage(num) {
248
+ // console.log('queueRenderPage 226', this.pageRendering)
216
249
  if (this.pageRendering) {
217
250
  this.pageNumPending = num
218
251
  } else {
@@ -231,6 +264,10 @@ export default {
231
264
  // console.log('-----encodeURI------', url)
232
265
  // }
233
266
  console.log('----PdfView---', url)
267
+ if (this.pdfDoc) {
268
+ // console.log('pdfDocument is ready destroy,,')
269
+ this.pdfDoc.destroy();
270
+ }
234
271
  let pdfDoc_
235
272
  try {
236
273
  pdfDoc_ = await PDFJS.getDocument({
@@ -249,16 +286,13 @@ export default {
249
286
  } finally {
250
287
  this.fileLoading = false
251
288
  }
252
-
253
- // 初始化pdf
254
- if (this.pdfDoc) {
255
- console.log('pdfDocument is ready destroy,,')
256
- await this.closepdf();
257
- this.pdfDoc = null
258
- }
289
+ // console.log('pdfDoc_', pdfDoc_)
290
+ // debugger
259
291
  this.pdfDoc = pdfDoc_
292
+ // 初始化pdf
260
293
  this.page_count = pdfDoc_.numPages
261
294
  this.$emit('numPages', pdfDoc_.numPages)
295
+ // console.log('265', this.pageRendering)
262
296
  this.renderPage(this.pageNum)
263
297
  this.emitPage(this.pageNum)
264
298
  },
@@ -272,15 +306,19 @@ export default {
272
306
  },
273
307
  updateScale() {
274
308
  this.compuscale = this.scale
309
+ // console.log('updateScale 278')
310
+ this.renderPage(this.pageNum)
311
+ },
312
+ onScale(scale) {
313
+ this.compuscale = scale
314
+ this.renderPage(this.pageNum)
315
+ },
316
+ onRotate(rotate) {
317
+ this.compuRotate = rotate
275
318
  this.renderPage(this.pageNum)
276
319
  },
277
320
  },
278
321
  mounted() {
279
- this.compuscale = this.scale
280
- // this.initPage = true
281
- // if (this.pdfurl) {
282
- // this.loadUrl(this.pdfurl)
283
- // }
284
322
  },
285
323
  beforeDestroy() {
286
324
  // console.log('---', this.pdfDoc)
@@ -289,21 +327,34 @@ export default {
289
327
  }
290
328
  },
291
329
  watch: {
292
- scale(val) {
293
- if (val) {
294
- this.compuscale = val
295
- }
330
+ scale: {
331
+ handler(val) {
332
+ if (val) {
333
+ this.compuscale = val
334
+ }
335
+ },
336
+ immediate: true,
337
+ },
338
+ rotate: {
339
+ handler(val) {
340
+ if (val) {
341
+ this.compuRotate = val
342
+ }
343
+ },
344
+ immediate: true,
296
345
  },
297
346
  pdfurl: {
298
347
  handler(val) {
348
+ // console.log('watch url change: ', val)
349
+ if (this.pdfDoc) {
350
+ // console.log('closepdf')
351
+ this.closepdf();
352
+ }
299
353
  this.$nextTick(() => {
300
354
  if (val) {
301
355
  this.pageNum = 1
302
356
  this.initPage = true
303
357
  this.loadUrl(val)
304
- if (this.pdfDoc) {
305
- this.closepdf();
306
- }
307
358
  }
308
359
  if (this.showPages) {
309
360
  this.$refs.switchPage.setPage(1)
@@ -314,7 +365,13 @@ export default {
314
365
  },
315
366
  // 监听页码变化,渲染对应合同页
316
367
  page(newPage, oldPage) {
317
- this.queueRenderPage(newPage)
368
+ // console.log('watch page change: ', newPage)
369
+ if (this.pdfDoc) {
370
+ this.queueRenderPage(newPage)
371
+ } else {
372
+ this.pageNum = newPage
373
+ // console.log('no pdfDoc')
374
+ }
318
375
  },
319
376
  },
320
377
  }
@@ -1,79 +1,191 @@
1
1
  <template lang="html">
2
2
  <div class="switch-page">
3
- <el-button size="mini" @click="switchPage('prev')"><i class="el-icon-caret-left"></i></el-button>
4
- <el-button size="mini" @click="switchPage('next')"><i class="el-icon-caret-right"></i></el-button>
5
- <span style="margin-left: 10px;">{{page}}/{{numPages}}</span>
6
- <span style="margin-left: 6px">
7
- 跳转至
8
- <el-input v-model.number="itemPage" style="width: 50px;margin: 0 4px" size="mini" @keyup.native.enter="goPage"></el-input>
9
-
10
- </span>
3
+ <div class='switch-page-btn'>
4
+ <el-button size="mini" @click="switchPage('prev')" icon=el-icon-arrow-up>上一页</el-button>
5
+ <el-button size="mini" @click="switchPage('next')" icon=el-icon-arrow-down>下一页</el-button>
6
+ <span style="margin-left: 6px">
7
+ <el-input v-model.number="itemPage" style="width: 50px;margin: 0 4px; font-size:14px;" size="mini"
8
+ @keyup.native.enter="goPage" @change="goPage"></el-input>/{{numPages}}
9
+ </span>
10
+ </div>
11
+ <div class='switch-page-scale'>
12
+ <el-button size="mini" :disabled="!zoomEnable" @click="zoomIn" icon=el-icon-minus></el-button>
13
+ <el-button size="mini" :disabled="!zoomEnable" @click="zoomOut" icon=el-icon-plus></el-button>
14
+ <el-select v-model="itemScale" :disabled="!zoomEnable" @change=onZoomChange size="mini" style="margin-left:10px" placeholder="请选择">
15
+ <el-option
16
+ v-for="item in EnumOptions"
17
+ :key="item.value"
18
+ :label="item.label"
19
+ :value="item.value">
20
+ </el-option>
21
+ </el-select>
22
+ </div>
23
+ <div class='switch-page-rotate'>
24
+ <el-button size="mini" @click="rotateRight" :disabled="!rotateEnable" icon=el-icon-refresh-right>顺时针旋转</el-button>
25
+ <el-button size="mini" @click="rotateLeft" :disabled="!rotateEnable" icon=el-icon-refresh-left>逆时针旋转</el-button>
26
+ </div>
11
27
  </div>
12
28
  </template>
13
29
 
14
30
  <script>
31
+ import { maxscale, minscale } from './PdfView216.vue'
32
+
33
+ export const EnumOptions = [
34
+ // { label: '自动缩放', value: '' },
35
+ // { label: '实际大小', value: '' },
36
+ // { label: '适合页面', value: '' },
37
+ // { label: '适合页宽', value: 'auto' },
38
+ { label: '50%', value: '50%' },
39
+ { label: '75%', value: '75%' },
40
+ { label: '100%', value: '100%' },
41
+ { label: '125%', value: '125%' },
42
+ { label: '150%', value: '150%' },
43
+ { label: '200%', value: '200%' },
44
+ { label: '300%', value: '300%' },
45
+ ]
15
46
  export default {
16
47
  name: 'switch-page',
17
48
  props: {
18
49
  numPages: {
19
50
  type: [Number, String],
20
51
  },
52
+ page: {
53
+ type: [Number, String],
54
+ default: 1,
55
+ },
56
+ scale: {
57
+ type: [Number],
58
+ default: 1,
59
+ },
60
+ rotate: {
61
+ type: [Number],
62
+ default: 0,
63
+ },
64
+ zoomEnable: {
65
+ type: [String, Number, Boolean],
66
+ default: false,
67
+ },
68
+ rotateEnable: {
69
+ type: [String, Number, Boolean],
70
+ default: false,
71
+ },
21
72
  },
22
73
  data() {
23
74
  return {
24
- page: 1,
25
- itemPage: '',
75
+ itemPage: '', // 内部保存的页码,
76
+ EnumOptions,
77
+ itemScale: 'auto',
78
+ itemRotate: 0,
26
79
  }
27
80
  },
28
81
  watch: {
29
- numPages() {
30
- this.page = 1
31
- this.itemPage = ''
82
+ page: {
83
+ handler(value) {
84
+ this.itemPage = value
85
+ },
86
+ immediate: true,
87
+ },
88
+ numPages: {
89
+ handler(value) {
90
+ this.itemPage = 1
91
+ },
92
+ },
93
+ scale: {
94
+ handler(value) {
95
+ this.itemScale = `${Math.round(value * 100)}%`
96
+ },
97
+ immediate: true,
98
+ },
99
+ rotate: {
100
+ handler(value) {
101
+ this.itemRotate = value
102
+ },
103
+ immediate: true,
32
104
  },
33
105
  },
34
106
  methods: {
35
107
  switchPage(str) {
36
108
  if (str === 'prev') {
37
- if (this.page === 1) {
109
+ if (this.itemPage === 1) {
38
110
  return
39
111
  }
40
- this.page--
112
+ this.itemPage--
41
113
  }
42
114
  if (str === 'next') {
43
- if (this.page === this.numPages) {
115
+ if (this.itemPage === this.numPages) {
44
116
  this.$message({ message: '当前已是最后一页', type: 'warning' })
45
117
  return
46
118
  }
47
- this.page++
119
+ this.itemPage++
48
120
  }
49
- this.$emit('page', this.page)
121
+ this.$emit('page', this.itemPage)
50
122
  },
51
123
  setPage(page = 1) {
52
- this.page = page
124
+ this.itemPage = page
53
125
  },
54
126
  goPage() {
55
127
  if (this.itemPage > 0) {
56
128
  if (this.itemPage >= this.numPages) {
57
- this.page = this.numPages
58
- this.itemPage = this.page
59
- } else {
60
- this.page = this.itemPage
129
+ this.itemPage = this.numPages
61
130
  }
62
- this.$emit('page', this.page)
131
+ } else {
132
+ this.itemPage = 1
133
+ }
134
+ this.$emit('page', this.itemPage)
135
+ },
136
+ zoomIn() {
137
+ let numScale = window.parseInt(this.itemScale)
138
+ if (Number.isNaN(numScale)) {
139
+ numScale = 100
140
+ this.itemScale = `${numScale}%`
141
+ this.$emit('zoom', numScale / 100)
142
+ }
143
+ if (numScale > minscale * 100) {
144
+ numScale -= 10
145
+ this.itemScale = `${numScale}%`
146
+ this.$emit('zoom', numScale / 100)
147
+ }
148
+ },
149
+ zoomOut() {
150
+ let numScale = window.parseInt(this.itemScale)
151
+ if (Number.isNaN(numScale)) {
152
+ numScale = 100
153
+ this.itemScale = `${numScale}%`
154
+ this.$emit('zoom', numScale / 100)
155
+ }
156
+ if (numScale < maxscale * 100) {
157
+ numScale += 10
158
+ this.itemScale = `${numScale}%`
159
+ this.$emit('zoom', numScale / 100)
63
160
  }
64
161
  },
162
+ onZoomChange() {
163
+ const numScale = window.parseInt(this.itemScale)
164
+ this.$emit('zoom', numScale / 100)
165
+ },
166
+ rotateRight() {
167
+ this.$emit('rotate', this.itemRotate + 90)
168
+ },
169
+ rotateLeft() {
170
+ this.$emit('rotate', this.itemRotate - 90)
171
+ },
65
172
  },
66
173
  }
67
174
  </script>
68
175
 
69
- <style lang="css" scoped>
176
+ <style lang="less" scoped>
70
177
  .switch-page {
71
178
  margin: 0;
72
179
  padding: 0;
73
- overflow: auto;
180
+ display: flex;
181
+ flex-direction: row;
182
+ .switch-page-scale{
183
+ flex: 1;
184
+ text-align: center;
185
+ }
74
186
  }
75
187
  .switch-page button {
76
- font-size: 16px;
188
+ font-size: 14px;
77
189
  padding: 6px !important;
78
190
  }
79
191
  </style>