// Handle PDFs with variable page sizes // Procedural implementation (no OOP) interface PageInfo { pageNumber: number; width: number; height: number; rotation: number; } interface PDFPageSizesState { pageSizes: Map; defaultSize: { width: number; height: number }; } function createPDFPageSizes(): PDFPageSizesState { return { pageSizes: new Map(), defaultSize: { width: 595, height: 842 }, }; } async function loadPDFPageSizes( state: PDFPageSizesState, doc: any, ): Promise { const pageSizes = new Map(); for (let pageNum = 1; pageNum <= doc.numPages; pageNum++) { const page = await doc.getPage(pageNum); const viewport = page.getViewport({ scale: 1 }); const pageInfo: PageInfo = { pageNumber: pageNum, width: viewport.width, height: viewport.height, rotation: viewport.rotation, }; pageSizes.set(pageNum, pageInfo); } return { ...state, pageSizes }; } function getPDFPageSize( state: PDFPageSizesState, pageNumber: number, ): PageInfo | null { return state.pageSizes.get(pageNumber) || null; } function isPDFPageLandscape( state: PDFPageSizesState, pageNumber: number, ): boolean { const size = getPDFPageSize(state, pageNumber); if (!size) return false; const effectiveWidth = size.rotation === 90 || size.rotation === 270 ? size.height : size.width; const effectiveHeight = size.rotation === 90 || size.rotation === 270 ? size.width : size.height; return effectiveWidth > effectiveHeight; } function getPDFCommonSize(state: PDFPageSizesState): { width: number; height: number; } { if (state.pageSizes.size === 0) { return state.defaultSize; } const sizeGroups: Map< string, { width: number; height: number; count: number } > = new Map(); state.pageSizes.forEach((size) => { const key = getPageSizeKey(size.width, size.height); const existing = sizeGroups.get(key); if (existing) { existing.count++; } else { sizeGroups.set(key, { width: size.width, height: size.height, count: 1 }); } }); let mostCommon = state.defaultSize; let maxCount = 0; sizeGroups.forEach((size) => { if (size.count > maxCount) { maxCount = size.count; mostCommon = { width: size.width, height: size.height }; } }); return mostCommon; } function getPageSizeKey(width: number, height: number): string { const w = Math.round(width / 10) * 10; const h = Math.round(height / 10) * 10; return `${w}x${h}`; }