2023-11-17 13:46:38 +01:00

120 lines
3.7 KiB
JavaScript

class Annotation {
createAnnotations(document) {
const annotations = [];
document.elements.forEach((element) => {
console.log("Creating annotation for element", element.id)
const [annotation, formField] = this.createAnnotationFromElement(element)
annotations.push(annotation);
annotations.push(formField);
})
return annotations;
}
async deleteAnnotations(instance) {
let pageAnnotations = (
await Promise.all(Array.from({ length: instance.totalPageCount }).map((_, pageIndex) =>
instance.getAnnotations(pageIndex)
))
).flatMap((annotations) =>
annotations.reduce((acc, annotation) => acc.concat(annotation), [])
).filter((annotation) => !!annotation.isSignature || annotation.description == "FRAME");
//deleting all Annotations
return await instance.delete(pageAnnotations);
}
async validateAnnotations(instance) {
let pageAnnotations = (
await Promise.all(Array.from({ length: instance.totalPageCount }).map((_, pageIndex) =>
instance.getAnnotations(pageIndex)
))
).flatMap((annotations) =>
annotations.reduce((acc, annotation) => acc.concat(annotation), [])
).map((annotation) => {
console.log(annotation.toJS());
return annotation;
});
return true;
}
createAnnotationFromElement(element) {
const id = PSPDFKit.generateInstantId()
const width = this.inchToPoint(element.width)
const height = this.inchToPoint(element.height)
const top = this.inchToPoint(element.top) - (height / 2)
const left = this.inchToPoint(element.left) - (width / 2)
const page = element.page - 1
const annotation = this.createSignatureAnnotation(id, width, height, top, left, page)
console.log(annotation)
const formField = new PSPDFKit.FormFields.SignatureFormField({
name: id,
annotationIds: PSPDFKit.Immutable.List([annotation.id])
})
console.log(formField)
return [annotation, formField]
}
createSignatureAnnotation(id, width, height, top, left, pageIndex) {
const annotation = new PSPDFKit.Annotations.WidgetAnnotation({
id: id,
pageIndex: pageIndex,
formFieldName: id,
boundingBox: new PSPDFKit.Geometry.Rect({ width, height, top, left })
})
return annotation
}
async createAnnotationFrameBlob(receiverName, width, height) {
const canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext("2d");
const date = new Date();
const dateString = date.toLocaleDateString("de-DE");
const signatureLength = 100;
ctx.beginPath();
ctx.moveTo(30, 10);
ctx.lineTo(signatureLength, 10);
ctx.moveTo(30, 10);
ctx.arcTo(10, 10, 10, 30, 20);
ctx.moveTo(10, 30);
ctx.arcTo(10, 50, 30, 50, 20);
ctx.moveTo(30, 50);
ctx.lineTo(signatureLength, 50);
ctx.strokeStyle = "darkblue";
ctx.stroke();
ctx.fillStyle = "black";
ctx.font = "10px serif";
ctx.fillText("Signed by", 30, 10)
ctx.fillText(receiverName + ", " + dateString, 15, 60)
return new Promise(resolve => {
canvas.toBlob((blob) => {
const url = URL.createObjectURL(blob);
resolve(url)
})
})
}
inchToPoint(inch) {
return inch * 72;
}
}