pdf-js-wrapper.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // NOTE: using "legacy" build as main build requires webpack v5
  2. // import PDFJS from 'pdfjs-dist/webpack'
  3. import * as PDFJS from 'pdfjs-dist/legacy/build/pdf'
  4. import * as PDFJSViewer from 'pdfjs-dist/legacy/web/pdf_viewer'
  5. import PDFJSWorker from 'pdfjs-dist/legacy/build/pdf.worker'
  6. import 'pdfjs-dist/legacy/web/pdf_viewer.css'
  7. import getMeta from '../../../utils/meta'
  8. if (typeof window !== 'undefined' && 'Worker' in window) {
  9. PDFJS.GlobalWorkerOptions.workerPort = new PDFJSWorker()
  10. }
  11. const params = new URLSearchParams(window.location.search)
  12. const disableFontFace = params.get('disable-font-face') === 'true'
  13. const cMapUrl = getMeta('ol-pdfCMapsPath')
  14. const imageResourcesPath = getMeta('ol-pdfImageResourcesPath')
  15. const rangeChunkSize = 128 * 1024 // 128K chunks
  16. export default class PDFJSWrapper {
  17. constructor(container) {
  18. this.container = container
  19. // create the event bus
  20. const eventBus = new PDFJSViewer.EventBus()
  21. // create the link service
  22. const linkService = new PDFJSViewer.PDFLinkService({
  23. eventBus,
  24. externalLinkTarget: 2,
  25. externalLinkRel: 'noopener',
  26. })
  27. // create the localization
  28. const l10n = new PDFJSViewer.GenericL10n('en-GB') // TODO: locale mapping?
  29. // create the viewer
  30. const viewer = new PDFJSViewer.PDFViewer({
  31. container,
  32. eventBus,
  33. imageResourcesPath,
  34. linkService,
  35. l10n,
  36. enableScripting: false, // default is false, but set explicitly to be sure
  37. renderInteractiveForms: false,
  38. })
  39. linkService.setViewer(viewer)
  40. this.eventBus = eventBus
  41. this.linkService = linkService
  42. this.viewer = viewer
  43. }
  44. // load a document from a URL
  45. async loadDocument(url) {
  46. const doc = await PDFJS.getDocument({
  47. url,
  48. cMapUrl,
  49. cMapPacked: true,
  50. disableFontFace,
  51. rangeChunkSize,
  52. disableAutoFetch: true,
  53. disableStream: true,
  54. textLayerMode: 2, // PDFJSViewer.TextLayerMode.ENABLE,
  55. }).promise
  56. this.viewer.setDocument(doc)
  57. this.linkService.setDocument(doc)
  58. return doc
  59. }
  60. // update the current scale value if the container size changes
  61. updateOnResize() {
  62. const currentScaleValue = this.viewer.currentScaleValue
  63. if (
  64. currentScaleValue === 'auto' ||
  65. currentScaleValue === 'page-fit' ||
  66. currentScaleValue === 'page-width'
  67. ) {
  68. this.viewer.currentScaleValue = currentScaleValue
  69. }
  70. this.viewer.update()
  71. }
  72. // get the page and offset of a click event
  73. clickPosition(event, pageElement, textLayer) {
  74. const { viewport } = this.viewer.getPageView(textLayer.pageNumber - 1)
  75. const pageRect = pageElement.querySelector('canvas').getBoundingClientRect()
  76. const dx = event.clientX - pageRect.left
  77. const dy = event.clientY - pageRect.top
  78. const [left, top] = viewport.convertToPdfPoint(dx, dy)
  79. return {
  80. page: textLayer.pageNumber - 1,
  81. offset: {
  82. left,
  83. top: viewport.viewBox[3] - top,
  84. },
  85. }
  86. }
  87. // get the current page, offset and page size
  88. get currentPosition() {
  89. const pageIndex = this.viewer.currentPageNumber - 1
  90. const pageView = this.viewer.getPageView(pageIndex)
  91. const pageRect = pageView.div.getBoundingClientRect()
  92. const containerRect = this.container.getBoundingClientRect()
  93. const dy = containerRect.top - pageRect.top
  94. const [, , width, height] = pageView.viewport.viewBox
  95. const [, top] = pageView.viewport.convertToPdfPoint(0, dy)
  96. return {
  97. page: pageIndex,
  98. offset: { top, left: 0 },
  99. pageSize: { height, width },
  100. }
  101. }
  102. }