Pdf.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import React, { useEffect, useState, useRef } from 'react';
  2. // @ts-ignore
  3. import pdfjs, { AnnotationLayer } from 'pdfjs-dist';
  4. // @ts-ignore
  5. import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
  6. const CMAP_URL = '../../node_modules/pdfjs-dist/cmaps/';
  7. const CMAP_PACKED = true;
  8. pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
  9. type Props = {
  10. src: string;
  11. };
  12. type PropsProgress = {
  13. loaded: number;
  14. total: number
  15. }
  16. const PdfComponent: React.FunctionComponent<Props> = ({
  17. src,
  18. }) => {
  19. const canvasRef = useRef<HTMLCanvasElement>(null);
  20. const annotationRef = useRef<HTMLDivElement>(null);
  21. const [viewportState, setViewport] = useState({width: 0, height: 0});
  22. const fetchPdf = async () => {
  23. const loadingTask = pdfjs.getDocument({
  24. url: src,
  25. cMapUrl: CMAP_URL,
  26. cMapPacked: CMAP_PACKED,
  27. });
  28. loadingTask.onProgress = (progress: PropsProgress) => {
  29. console.log(progress);
  30. };
  31. const pdf = await loadingTask.promise;
  32. const totalNum = pdf.numPages;
  33. console.log(totalNum);
  34. const firstPageNumber = 1;
  35. const page = await pdf.getPage(firstPageNumber);
  36. const scale = 1;
  37. const viewport = page.getViewport({ scale });
  38. setViewport(viewport);
  39. const canvas = canvasRef.current;
  40. let emptyCanvas: HTMLCanvasElement = document.createElement("canvas");
  41. let context: CanvasRenderingContext2D = emptyCanvas.getContext('2d')!;
  42. if (canvas) {
  43. context = canvas.getContext('2d')!;
  44. canvas.height = viewport.height;
  45. canvas.width = viewport.width;
  46. }
  47. // Render PDF page into canvas context
  48. const renderContext = {
  49. canvasContext: context,
  50. viewport,
  51. };
  52. const renderTask = page.render(renderContext);
  53. await renderTask.promise;
  54. page.getAnnotations({ intent: 'display' }).then((annotations : []) => {
  55. console.log(annotations);
  56. AnnotationLayer.update({
  57. viewport: viewport.clone({ dontFlip: true, }),
  58. annotations,
  59. div: annotationRef.current,
  60. page,
  61. });
  62. })
  63. };
  64. useEffect(() => {
  65. fetchPdf();
  66. }, []);
  67. return (
  68. <>
  69. <canvas
  70. ref={canvasRef}
  71. width={viewportState.width}
  72. height={viewportState.height}
  73. />
  74. <div ref={annotationRef} />
  75. </>
  76. );
  77. };
  78. export default PdfComponent;