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
JavaScript
;
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;