index.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React, { useEffect, useState, useRef } from 'react';
  2. import Watermark from '../Watermark';
  3. import { renderPdfPage } from '../../helpers/pdf';
  4. import {
  5. PageWrapper,
  6. PdfCanvas,
  7. AnnotationLayer,
  8. TextLayer,
  9. WatermarkLayer,
  10. } from './styled';
  11. type Props = {
  12. pageNum: number;
  13. renderingState?: RenderingStateType;
  14. getPage?: () => Promise<any>;
  15. viewport: ViewportType;
  16. rotation?: number;
  17. scale: number;
  18. annotations?: React.ReactNode[];
  19. drawing?: React.ReactNode[];
  20. watermark?: WatermarkType;
  21. setTextDivs: (pageNum: number, elements: HTMLElement[]) => void;
  22. currentPage: number;
  23. };
  24. const PageView: React.FC<Props> = ({
  25. pageNum,
  26. getPage,
  27. viewport,
  28. renderingState = 'PAUSED',
  29. rotation,
  30. scale,
  31. annotations = [],
  32. watermark = {},
  33. currentPage,
  34. setTextDivs,
  35. }: Props) => {
  36. const rootEle = useRef<HTMLDivElement | null>(null);
  37. const [pdfPage, setPdfPage] = useState<any>(null);
  38. const [renderTask, setRenderTask] = useState<any>(null);
  39. const renderPage = async (): Promise<any> => {
  40. if (getPage) {
  41. getPage().then(obj => {
  42. setPdfPage(obj);
  43. const setTextDivsWithPage = (elements: HTMLElement[]) => {
  44. if (currentPage === pageNum) {
  45. setTextDivs(pageNum, elements);
  46. }
  47. };
  48. if (rootEle.current) {
  49. renderPdfPage({
  50. rootEle: rootEle.current,
  51. pdfPage: obj,
  52. viewport,
  53. setRenderTask,
  54. setTextDivs: setTextDivsWithPage,
  55. });
  56. }
  57. });
  58. }
  59. };
  60. useEffect(() => {
  61. if (pdfPage) {
  62. pdfPage.cleanup();
  63. }
  64. if (renderTask) {
  65. renderTask.cancel();
  66. }
  67. if (renderingState === 'RENDERING') {
  68. renderPage();
  69. }
  70. }, [currentPage, renderingState, viewport]);
  71. return (
  72. <PageWrapper
  73. ref={rootEle}
  74. id={`page_${pageNum}`}
  75. data-page-num={pageNum}
  76. width={viewport.width}
  77. height={viewport.height}
  78. rotation={rotation}
  79. >
  80. {renderingState === 'LOADING' ? (
  81. <>
  82. <TextLayer data-id="text-layer" />
  83. </>
  84. ) : (
  85. <>
  86. <PdfCanvas />
  87. {watermark.text || watermark.imagepath ? (
  88. <WatermarkLayer>
  89. <Watermark viewScale={scale} {...watermark} />
  90. </WatermarkLayer>
  91. ) : (
  92. ''
  93. )}
  94. <TextLayer data-id="text-layer" />
  95. <AnnotationLayer data-id="annotation-layer">
  96. {annotations}
  97. </AnnotationLayer>
  98. </>
  99. )}
  100. </PageWrapper>
  101. );
  102. };
  103. export default PageView;