React 및 Puppeteer: PDF 생성(클라이언트 다운로드 및 인쇄)
요약
이제 서버가 설정되었습니다. 이제 이 API를 사용할 수 있는 클라이언트와 모든 것을 하나로 묶을 것입니다.
설정 UI
1 단계
생성된 PDF의 인쇄 및 다운로드를 관리하는 몇 가지 후크를 만들어 보겠습니다.
다음 후크는 다음을 담당합니다.
나중에 Blob URL을 어떻게 사용할 수 있습니까?
// file: apps/ui-app/src/app/hooks/use-generate-pdf-blob-url.ts
import { useEffect, useState } from 'react';
import { useDebouncedCallback } from 'use-debounce';
import axios, { AxiosResponse } from 'axios';
import { PDFDocumentData } from '@pdf-generation/constants';
import { PdfDocProps } from '@pdf-generation/pdf-doc';
import { pdfData } from '../app.constants';
const generatePdfDocument = (data: PDFDocumentData<PdfDocProps>) => {
  return axios.post<
    PDFDocumentData<PdfDocProps>,
    AxiosResponse<{ data: number[] }>
  >('/api/pdf/generate', data);
};
export const useGeneratePDFBlobURL = ({ enabled = true } = {}) => {
  const [isGeneratingPdf, setIsGeneratingPdf] = useState(false);
  const [pdfBlobURL, setPdfBlobURL] = useState<string>();
  const [error, setError] = useState();
  const generatePdf = useDebouncedCallback(
    (data) => {
      generatePdfDocument(data)
        .then(({ data: pdfBufferData }) => {
          const blob = new Blob([new Uint8Array(pdfBufferData.data)], {
            type: 'application/pdf',
          });
          const blobURL = URL.createObjectURL(blob);
          setIsGeneratingPdf(false);
          setPdfBlobURL(blobURL);
        })
        .catch((generationError) => {
          setIsGeneratingPdf(false);
          setError(generationError);
        });
    },
    500,
    { maxWait: 2000 }
  );
  useEffect(() => {
    if (!pdfBlobURL && enabled) {
      generatePdf.cancel();
      setIsGeneratingPdf(true);
      generatePdf(pdfData);
    }
    return () => {
      if (pdfBlobURL) {
        URL.revokeObjectURL(pdfBlobURL);
      }
    };
  }, [generatePdf, pdfBlobURL, enabled]);
  return {
    isGeneratingPdf,
    pdfBlobURL,
    error,
  };
};
이 다음 후크는 Blob URL을 수락하는 데 사용할 수 있으며 PDF를 다운로드하는 작업으로 사용할 수 있습니다.
// file: apps/ui-app/src/app/hooks/use-pdf-link-downloader.ts
import { useCallback } from 'react';
export const usePDFLinkDownloader = () => {
  const downloadPdf = useCallback((blobURL: string, fileName: string) => {
    const link = document.createElement('a');
    document.body.appendChild(link);
    link.setAttribute('style', 'display: none');
    link.href = blobURL;
    link.download = fileName;
    link.click();
    setTimeout(() => {
      document.body.removeChild(link);
    }, 300);
  }, []);
  return {
    downloadPdf,
  };
};
이 다음 후크는 Blob URL을 수락하는 데 사용할 수 있으며 PDF를 인쇄하는 작업으로 사용할 수 있습니다.
// file: apps/ui-app/src/app/hooks/use-print-pdf.ts
import { useCallback } from 'react';
export const usePrintPDF = () => {
  const printPdf = useCallback((blobURL: string) => {
    const iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    iframe.style.display = 'none';
    iframe.src = blobURL;
    iframe.onload = function print() {
      setTimeout(() => {
        iframe.focus();
        iframe?.contentWindow?.print();
      }, 1);
    };
  }, []);
  return {
    printPdf,
  };
};
그게 다야!
이제 원하는 대로 UI를 공식화할 수 있습니다.
전체 솔루션을 보려면 repository을 참조하십시오.
git clone https://github.com/lwhiteley/pdf-generation-experiment
cd pdf-generation-experiment
pnpm i
pnpm nx run-many --target=serve --projects=pdf-server,ui-app
이러한 명령을 실행한 후 앱을 사용하여 위에 나열된 작업을 수행할 수 있습니다.
무엇 향후 계획?
Reference
이 문제에 관하여(React 및 Puppeteer: PDF 생성(클라이언트 다운로드 및 인쇄)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lwhiteley/react-and-puppeteer-pdf-generation-client-download-and-print-24g8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)