Export PDF ink annotation as image | Nutrient
Ink annotations are rendered as SVG elements on the DOM. To export an image from an ink annotation, retrieve the SVG and then either download it with an image/svg+xml MIME type, or render it to a canvas as a PNG:
// "annotation" is a reference to our ink annotation.
const svgSelector = `.PSPDFKit-Ink-Annotation[data-annotation-id="${annotation.id}"] svg`;
// Wait until the SVG is rendered.const observer = new MutationObserver(async () => { const svgEl = instance.contentDocument.querySelector(svgSelector); if (svgEl) { observer.disconnect();
// We need to set the first "g" element to transparent. svgEl.querySelector("g").style.fill = "transparent";
// Apply 'round' `strokeLinecap` and `strokeLinejoin` styles to all // 'path' elements in 'svgEl' for smooth line endings and joints. const paths = svgEl.querySelectorAll("path");
paths.forEach((path) => { path.style.strokeLinecap = "round"; path.style.strokeLinejoin = "round"; });
// Serialize to XML. const svg = new XMLSerializer().serializeToString(svgEl);
// Download the SVG. const link = document.createElement("a"); link.href = `data:svg+xml; charset=utf-8, ${svg}`; link.download = `${annotation.id}.svg`; link.click();
// Instead of downloading the SVG, we can instead // render it to a canvas and export the blob // as a PNG. }});observer.observe(page, { subtree: true, childList: true });If you’d like to export it as a PNG instead, we can continue from the previous snippet by — instead of downloading the SVG — taking the svg reference, rendering it to a canvas, and then exporting the blob:
const img = new Image();img.src = `data:image/svg+xml; charset=utf-8, ${svg}`;img.onload = () => { const canvas = document.createElement("canvas"); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; const ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0); canvas.toBlob( async (blob) => { // We can process the blob as we'd like here. }, { type: "image/png" } );};This has been tested with Nutrient Web SDK 2020.2.6.