ultisuite-client/lib/drive/docs-pdf-export.ts
R3D347HR4Y 303b2b1074
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
wow
2026-06-11 01:22:40 +02:00

79 lines
2.5 KiB
TypeScript

import { DOCS_PAGE_GAP_PX } from "@/lib/drive/docs-page-layout-constants"
import type { DocsExportSnapshot } from "@/lib/drive/docs-export-snapshot"
import { prepareDocsPrintEnvironment } from "@/lib/drive/docs-print"
import { exportFileName } from "@/lib/drive/docs-export-download"
function downloadBlob(blob: Blob, fileName: string) {
const url = URL.createObjectURL(blob)
const anchor = document.createElement("a")
anchor.href = url
anchor.download = fileName
anchor.click()
URL.revokeObjectURL(url)
}
export async function exportDocsToPdf(snapshot: DocsExportSnapshot): Promise<void> {
const cleanup = await prepareDocsPrintEnvironment(snapshot, "pdf-capture")
try {
const stack = snapshot.getPageStackElement()
if (!stack) throw new Error("Page stack introuvable")
const canvasHost = stack.closest(".ultidrive-docs-canvas") as HTMLElement | null
if (!canvasHost) throw new Error("Canvas introuvable")
const pageHeight = Number(stack.dataset.docsPageHeight ?? snapshot.pageLayout.heightPx)
const pageWidth = Number(stack.dataset.docsPageWidth ?? snapshot.pageLayout.widthPx)
const pageCount = snapshot.pageCount
const [{ default: html2canvas }, { jsPDF }] = await Promise.all([
import("html2canvas"),
import("jspdf"),
])
const pdf = new jsPDF({
orientation: pageWidth > pageHeight ? "landscape" : "portrait",
unit: "mm",
format: [
snapshot.pageLayout.format.widthMm,
snapshot.pageLayout.format.heightMm,
],
})
const hostRect = canvasHost.getBoundingClientRect()
const stackRect = stack.getBoundingClientRect()
for (let pageIndex = 0; pageIndex < pageCount; pageIndex += 1) {
const yOffset = pageIndex * (pageHeight + DOCS_PAGE_GAP_PX)
const canvas = await html2canvas(canvasHost, {
backgroundColor: "#ffffff",
scale: 2,
useCORS: true,
logging: false,
width: pageWidth,
height: pageHeight,
x: stackRect.left - hostRect.left,
y: stackRect.top - hostRect.top + yOffset,
windowWidth: canvasHost.scrollWidth,
windowHeight: canvasHost.scrollHeight,
})
const imgData = canvas.toDataURL("image/jpeg", 0.92)
if (pageIndex > 0) pdf.addPage()
pdf.addImage(
imgData,
"JPEG",
0,
0,
snapshot.pageLayout.format.widthMm,
snapshot.pageLayout.format.heightMm
)
}
const blob = pdf.output("blob")
downloadBlob(blob, exportFileName(snapshot.sourceName, "pdf"))
} finally {
cleanup()
}
}