SecurePdfViewer.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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'
  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 pdf = await pdfjsLib.getDocument({
  24. data: decryptedData
  25. }).promise.catch((err) => {
  26. console.error('Error during get document:', err)
  27. return undefined
  28. })
  29. if (!pdf) return
  30. for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
  31. const page = await pdf.getPage(pageNum).catch((err) => {
  32. console.error(`Error during get page ${pageNum}:`, err)
  33. return undefined
  34. })
  35. if (!page) return
  36. const viewport = page.getViewport({ scale: 1.1 })
  37. const canvas = document.createElement('canvas');
  38. const ctx = canvas.getContext('2d')
  39. canvas.width = viewport.width
  40. canvas.height = viewport.height
  41. if (ctx) await page.render({ canvasContext: ctx, viewport }).promise.catch((err) => {
  42. console.error('Error during page render:', err)
  43. })
  44. canvas.style.marginBottom = '20px';
  45. container.value?.appendChild(canvas);
  46. }
  47. })
  48. </script>