mirror of
https://github.com/documenso/documenso.git
synced 2026-06-22 04:12:06 +10:00
0b9a23c550
Some PDFs have CropBox or MediaBox entries stored as a PDFDict instead of the expected PDFArray, causing pdf-lib to throw during lookup. Wrap both box lookups in try-catch and fall back to A4 dimensions when neither can be parsed
59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import type { PDFPage } from '@cantoo/pdf-lib';
|
|
import type { PDF } from '@libpdf/core';
|
|
|
|
import { PDF_SIZE_A4_72PPI } from '../../constants/pdf';
|
|
|
|
const MIN_CERT_PAGE_WIDTH = 300;
|
|
const MIN_CERT_PAGE_HEIGHT = 300;
|
|
|
|
/**
|
|
* Gets the effective page size for PDF operations.
|
|
*
|
|
* Uses CropBox by default to handle rare cases where MediaBox is larger than CropBox.
|
|
* Falls back to MediaBox when it's smaller than CropBox, following typical PDF reader behavior.
|
|
*/
|
|
export const getPageSize = (page: PDFPage) => {
|
|
let mediaBox;
|
|
let cropBox;
|
|
|
|
try {
|
|
mediaBox = page.getMediaBox();
|
|
} catch {
|
|
// MediaBox lookup can fail for malformed PDFs where the entry is not a valid PDFArray.
|
|
}
|
|
|
|
try {
|
|
cropBox = page.getCropBox();
|
|
} catch {
|
|
// CropBox lookup can fail for malformed PDFs where the entry is not a valid PDFArray.
|
|
}
|
|
|
|
if (mediaBox && cropBox) {
|
|
if (mediaBox.width < cropBox.width || mediaBox.height < cropBox.height) {
|
|
return mediaBox;
|
|
}
|
|
|
|
return cropBox;
|
|
}
|
|
|
|
// If either box is missing or invalid, fall back to MediaBox if available, otherwise CropBox, or default to A4 size.
|
|
return mediaBox || cropBox || PDF_SIZE_A4_72PPI;
|
|
};
|
|
|
|
export const getLastPageDimensions = (pdfDoc: PDF): { width: number; height: number } => {
|
|
const lastPage = pdfDoc.getPage(pdfDoc.getPageCount() - 1);
|
|
|
|
if (!lastPage) {
|
|
return PDF_SIZE_A4_72PPI;
|
|
}
|
|
|
|
const width = Math.round(lastPage.width);
|
|
const height = Math.round(lastPage.height);
|
|
|
|
if (width < MIN_CERT_PAGE_WIDTH || height < MIN_CERT_PAGE_HEIGHT) {
|
|
return PDF_SIZE_A4_72PPI;
|
|
}
|
|
|
|
return { width, height };
|
|
};
|