SecurePdfViewer.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <template>
  2. <div ref="container" style="border: 1px solid #ccc; width: 100%; height: 90vh; overflow-y: auto;" >
  3. <!-- <canvas ref="container" style="border: 1px solid #ccc; width: 100%; height: 100vh; overflow-y: auto;" /> -->
  4. </div>
  5. </template>
  6. <script lang="ts" setup>
  7. import { ref, onMounted } from 'vue-demi'
  8. import { withBase } from 'vitepress'
  9. import { decrypt } from '../../script/decrypt_pdf'
  10. // import * as pdfjsLib from 'pdfjs-dist'
  11. // import workerSrc from 'pdfjs-dist/build/pdf.worker.min.mjs?url'
  12. // pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc
  13. const props = defineProps<{
  14. fileUrl: string
  15. }>()
  16. const container = ref<HTMLCanvasElement | null>(null)
  17. onMounted(async () => {
  18. const decryptedData = await decrypt(withBase(props.fileUrl)).catch((err) => {
  19. console.error('Error during decrypt:', err)
  20. return undefined
  21. })
  22. if (!decryptedData) return
  23. const pdfjsLib = await import ('pdfjs-dist')
  24. const pdfjsWorkerImport = await import('pdfjs-dist/build/pdf.worker.min.mjs?url')
  25. pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorkerImport.default
  26. const pdf = await pdfjsLib.getDocument({
  27. data: decryptedData
  28. }).promise.catch((err) => {
  29. console.error('Error during get document:', err)
  30. return undefined
  31. })
  32. if (!pdf) return
  33. for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
  34. const page = await pdf.getPage(pageNum).catch((err) => {
  35. console.error(`Error during get page ${pageNum}:`, err)
  36. return undefined
  37. })
  38. if (!page) return
  39. const viewport = page.getViewport({ scale: 1.1 })
  40. const canvas = document.createElement('canvas');
  41. const ctx = canvas.getContext('2d')
  42. canvas.width = viewport.width
  43. canvas.height = viewport.height
  44. if (ctx) await page.render({ canvasContext: ctx, viewport }).promise.catch((err) => {
  45. console.error('Error during page render:', err)
  46. })
  47. canvas.style.marginBottom = '20px';
  48. container.value?.appendChild(canvas);
  49. }
  50. })
  51. </script>