UNPKG

pdf-e-signature

Version:

A React component that allows users to select positions for e-signatures on PDFs

80 lines (79 loc) 2.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.usePDF = void 0; var _react = require("react"); var _pdfLib = require("pdf-lib"); const usePDF = () => { const [scale, setScale] = (0, _react.useState)(1.5); const [currentPage, setCurrentPage] = (0, _react.useState)(1); const [numPages, setNumPages] = (0, _react.useState)(null); const [signedPdfUrl, setSignedPdfUrl] = (0, _react.useState)(null); const [isGeneratingPdf, setIsGeneratingPdf] = (0, _react.useState)(false); const onDocumentLoadSuccess = _ref => { let { numPages } = _ref; setNumPages(numPages); setCurrentPage(1); }; const generateSignedPdf = async (pdfFile, signaturePositions) => { setIsGeneratingPdf(true); try { const arrayBuffer = await pdfFile.arrayBuffer(); const pdfDoc = await _pdfLib.PDFDocument.load(arrayBuffer); for (const position of signaturePositions) { if (!position.signature) continue; const page = pdfDoc.getPages()[position.page - 1]; const { width: pdfWidth, height: pdfHeight } = page.getSize(); const signatureImage = await pdfDoc.embedPng(position.signature); const signatureWidth = 150; const signatureHeight = 50; const xPos = position.normalizedX * pdfWidth - signatureWidth / 2; const yPos = pdfHeight - position.normalizedY * pdfHeight - signatureHeight / 2; page.drawImage(signatureImage, { x: xPos, y: Math.max(0, Math.min(yPos, pdfHeight - signatureHeight)), width: signatureWidth, height: signatureHeight }); if (position.timestamp) { page.drawText(position.timestamp, { x: xPos + 15, y: Math.max(0, Math.min(yPos - 15, pdfHeight - signatureHeight)), size: 8 }); } } const pdfBytes = await pdfDoc.save(); const blob = new Blob([pdfBytes], { type: 'application/pdf' }); const url = URL.createObjectURL(blob); setSignedPdfUrl(url); return blob; } catch (error) { console.error('Error generating signed PDF:', error); alert('Error generating signed PDF. Please try again.'); } finally { setIsGeneratingPdf(false); } }; return { scale, setScale, currentPage, setCurrentPage, numPages, signedPdfUrl, isGeneratingPdf, onDocumentLoadSuccess, generateSignedPdf, setSignedPdfUrl }; }; exports.usePDF = usePDF;