Функциональность подписи в PDF -документах < /p>
const embedSignatureInPdf = async () => {
if (!signatureData) return null;
try {
let existingPdfBytes = null;
if (uploadedPdfBytes) {
existingPdfBytes = uploadedPdfBytes;
} else if (pdfUrl) {
try {
const response = await fetch(pdfUrl);
if (!response.ok) {
throw new Error(`Failed to fetch PDF: ${response.status} ${response.statusText}`);
}
existingPdfBytes = await response.arrayBuffer();
} catch (fetchError) {
console.error('Error fetching PDF:', fetchError);
return null;
}
} else {
return null;
}
const pdfDoc = await PDFDocument.load(existingPdfBytes, {
ignoreEncryption: true,
updateMetadata: false,
throwOnInvalidObject: false
});
const helveticaFont = await pdfDoc.embedFont(StandardFonts.HelveticaOblique);
const pages = pdfDoc.getPages();
if (pages.length === 0) {
return null;
}
const page = pages[selectedPageIndex];
const iframe = iframeRef.current;
const container = pdfContainerRef.current;
if (!iframe || !container) {
return null;
}
// Get container dimensions (more accurate than iframe)
const containerRect = container.getBoundingClientRect();
const displayWidth = containerRect.width;
const displayHeight = containerRect.height;
const pdfWidth = page.getWidth();
const pdfHeight = page.getHeight();
const scaleX = pdfWidth / displayWidth;
const scaleY = pdfHeight / displayHeight;
const sigPos = signatureDisplayPos || { left: 100, top: 100 };
// Adjust for any container padding/offset
const x = sigPos.left * scaleX;
// PDF coordinates start from bottom-left, so we need to flip Y
// Increase downward adjustment to three times more than current amount
const y = pdfHeight - (sigPos.top * scaleY) - 60; // Move 60 pixels down (three times the current 20)
if (signatureData.method === 'typed') {
const fontSize = 24;
page.drawText(signatureData.value, {
x,
y: y + fontSize, // Keep the text baseline adjustment
size: fontSize,
font: helveticaFont,
color: rgb(0, 0, 0),
});
pdfDoc.setTitle(`Signed: ${pdfDoc.getTitle() || 'Document'}`);
pdfDoc.setSubject('Electronically Signed Document');
} else if (signatureData.method === 'drawn' || signatureData.method === 'image') {
let image;
try {
if (signatureData.value.startsWith('data:image/jpeg')) {
image = await pdfDoc.embedJpg(signatureData.value);
} else {
image = await pdfDoc.embedPng(signatureData.value);
}
const dims = image.scale(0.5);
page.drawImage(image, {
x,
y: y + dims.height,
width: dims.width,
height: dims.height,
});
pdfDoc.setTitle(`Signed: ${pdfDoc.getTitle() || 'Document'}`);
pdfDoc.setSubject('Electronically Signed Document');
} catch (err) {
console.error('Error embedding signature image:', err);
throw err;
}
}
const pdfBytes = await pdfDoc.save({
useObjectStreams: false,
addDefaultPage: false,
objectsPerTick: 50
});
const blob = new Blob([pdfBytes], { type: 'application/pdf' });
return blob;
} catch (err) {
console.error('Failed to embed signature:', err);
throw err;
}
};
< /code>
У меня есть этот код, но когда я помещаю подпись в определенную позицию, она ставит выше, чем позиция, которую я положил после того, как я сохранил документ. Я хочу, чтобы подпись осталась на месте, в котором я ее положил.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ge-after-i