UNPKG

compare-pdf-plus

Version:

Standalone node module that compares PDFs

1 lines 42.5 kB
{"version":3,"sources":["../src/engines/graphicsMagick.ts","../src/engines/native.ts","../src/utils.ts","../src/compareData.ts","../src/compareImages.ts","../src/config.ts","../src/comparePdf.ts"],"names":["gm","config","path","applyCrop","applyMask","pdfToPng","fs","getDocument","Image","canvas","createCanvas","PNG","pixelmatch","filter"],"mappings":"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","file":"index.cjs","sourcesContent":["import gm from \"gm\";\nimport path from \"node:path\";\nimport type { Coordinates } from \"../comparePdf\";\n\ninterface PdfDetails {\n buffer: Buffer;\n filename: string;\n}\n\ninterface Config {\n settings: {\n density: number;\n quality: number;\n };\n}\n\ninterface CropCoordinates {\n width: number;\n height: number;\n x: number;\n y: number;\n}\n\n// const imageMagick = gm.subClass({ imageMagick: true });\nconst imageMagick = gm.subClass({ imageMagick: \"7+\" });\n\nexport const pdfToPng = (\n pdfDetails: PdfDetails,\n pngFilePath: string,\n config: Config,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n const pdfBuffer = pdfDetails.buffer;\n const pdfFilename = path.parse(pdfDetails.filename).name;\n\n imageMagick(pdfBuffer, pdfFilename)\n .command(\"convert\")\n .density(config.settings.density, config.settings.density)\n .quality(config.settings.quality)\n .write(pngFilePath, (err) => {\n err ? reject(err) : resolve();\n });\n });\n};\n\nexport const applyMask = (\n pngFilePath: string,\n coordinates: Coordinates = { x0: 0, y0: 0, x1: 0, y1: 0 },\n color = \"black\",\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n imageMagick(pngFilePath)\n .command(\"convert\")\n .drawRectangle(\n coordinates.x0,\n coordinates.y0,\n coordinates.x1,\n coordinates.y1,\n )\n .fill(color)\n .write(pngFilePath, (err) => {\n err ? reject(err) : resolve();\n });\n });\n};\n\nexport const applyCrop = (\n pngFilePath: string,\n coordinates: CropCoordinates = { width: 0, height: 0, x: 0, y: 0 },\n index = 0,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n imageMagick(pngFilePath)\n .command(\"convert\")\n .crop(coordinates.width, coordinates.height, coordinates.x, coordinates.y)\n .write(pngFilePath.replace(\".png\", `-${index}.png`), (err) => {\n err ? reject(err) : resolve();\n });\n });\n};\n","// For Node.js only pdf-js legacy is supported\nimport {\n getDocument,\n type PDFDocumentProxy,\n} from \"pdfjs-dist/legacy/build/pdf.mjs\";\nimport fs from \"fs-extra\";\nimport {\n type Canvas,\n type CanvasRenderingContext2D,\n createCanvas,\n Image,\n} from \"canvas\";\nimport type { Coordinates } from \"../comparePdf\";\n\nconst CMAP_URL = \"../../node_modules/pdfjs-dist/cmaps/\";\nconst CMAP_PACKED = true;\nconst STANDARD_FONT_DATA_URL = \"../../node_modules/pdfjs-dist/standard_fonts/\";\n\ninterface PdfDetails {\n buffer: ArrayBuffer;\n}\n\ninterface Config {\n settings: {\n disableFontFace?: boolean;\n verbosity?: number;\n };\n}\n\ninterface CropCoordinates {\n width: number;\n height: number;\n x: number;\n y: number;\n}\n\ninterface CanvasFactory {\n create: (\n width: number,\n height: number,\n ) => { canvas: Canvas; context: CanvasRenderingContext2D };\n reset: (\n canvasAndContext: { canvas: Canvas; context: CanvasRenderingContext2D },\n width: number,\n height: number,\n ) => void;\n destroy: (canvasAndContext: {\n canvas: Canvas;\n context: CanvasRenderingContext2D;\n }) => void;\n}\n\nexport const pdfPageToPng = async (\n pdfDocument: PDFDocumentProxy,\n pageNumber: number,\n filename: string,\n isSinglePage = false,\n): Promise<void> => {\n const page = await pdfDocument.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 1.38889 });\n const canvasFactory = pdfDocument.canvasFactory as CanvasFactory;\n const canvasAndContext = canvasFactory.create(\n viewport.width,\n viewport.height,\n );\n const renderContext = {\n canvasContext: canvasAndContext.context,\n viewport: viewport,\n };\n\n await page.render(renderContext).promise;\n\n const image = canvasAndContext.canvas.toBuffer(\"image/png\");\n const pngFileName = isSinglePage\n ? filename\n : filename.replace(\".png\", `-${pageNumber - 1}.png`);\n fs.writeFileSync(pngFileName, image);\n};\n\nexport const pdfToPng = async (\n pdfDetails: PdfDetails,\n pngFilePath: string,\n config: Config,\n): Promise<void> => {\n const pdfData = new Uint8Array(pdfDetails.buffer);\n const pdfDocument = await getDocument({\n disableFontFace: config.settings?.disableFontFace ?? true,\n data: pdfData,\n cMapUrl: CMAP_URL,\n cMapPacked: CMAP_PACKED,\n standardFontDataUrl: STANDARD_FONT_DATA_URL,\n verbosity: config.settings?.verbosity ?? 0,\n }).promise;\n\n for (let index = 1; index <= pdfDocument.numPages; index++) {\n await pdfPageToPng(\n pdfDocument,\n index,\n pngFilePath,\n pdfDocument.numPages === 1,\n );\n }\n};\n\nexport const applyMask = async (\n pngFilePath: string,\n coordinates: Coordinates = { x0: 0, y0: 0, x1: 0, y1: 0 },\n color = \"black\",\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n const data = fs.readFileSync(pngFilePath);\n const img = new Image();\n img.src = data;\n const canvas = createCanvas(img.width, img.height);\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0, img.width, img.height);\n ctx.beginPath();\n ctx.fillRect(\n coordinates.x0,\n coordinates.y0,\n coordinates.x1 - coordinates.x0,\n coordinates.y1 - coordinates.y0,\n );\n fs.writeFileSync(pngFilePath, canvas.toBuffer());\n resolve();\n });\n};\n\nexport const applyCrop = async (\n pngFilePath: string,\n coordinates: CropCoordinates = { width: 0, height: 0, x: 0, y: 0 },\n index = 0,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n const data = fs.readFileSync(pngFilePath);\n const img = new Image();\n img.src = data;\n const canvas = createCanvas(coordinates.width, coordinates.height);\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(\n img,\n coordinates.x,\n coordinates.y,\n coordinates.width,\n coordinates.height,\n 0,\n 0,\n coordinates.width,\n coordinates.height,\n );\n\n fs.writeFileSync(\n pngFilePath.replace(\".png\", `-${index}.png`),\n canvas.toBuffer(),\n );\n resolve();\n });\n};\n","import fs from \"fs-extra\";\n\ninterface ConfigPaths {\n actualPdfRootFolder: string;\n baselinePdfRootFolder: string;\n}\n\nexport interface Config {\n paths: ConfigPaths;\n}\n\nexport const copyJsonObject = <T>(jsonObject: T): T => {\n return JSON.parse(JSON.stringify(jsonObject));\n};\n\nexport const ensureAndCleanupPath = (filepath: string): void => {\n fs.ensureDirSync(filepath);\n fs.emptyDirSync(filepath);\n};\n\nexport const ensurePathsExist = (config: Config): void => {\n fs.ensureDirSync(config.paths.actualPdfRootFolder);\n fs.ensureDirSync(config.paths.baselinePdfRootFolder);\n};\n","import path from \"node:path\";\n\nexport interface CompareDetails {\n actualPdfFilename: string;\n baselinePdfFilename: string;\n actualPdfBuffer: Buffer;\n baselinePdfBuffer: Buffer;\n}\n\nexport interface CompareResult {\n status: \"passed\" | \"failed\";\n message?: string;\n}\n\nexport const comparePdfByBase64 = async ({\n actualPdfFilename,\n baselinePdfFilename,\n actualPdfBuffer,\n baselinePdfBuffer,\n}: CompareDetails): Promise<CompareResult> => {\n return new Promise((resolve) => {\n const actualPdfBaseName = path.parse(actualPdfFilename).name;\n const baselinePdfBaseName = path.parse(baselinePdfFilename).name;\n const actualPdfBase64 = Buffer.from(actualPdfBuffer).toString(\"base64\");\n const baselinePdfBase64 = Buffer.from(baselinePdfBuffer).toString(\"base64\");\n\n if (actualPdfBase64 !== baselinePdfBase64) {\n resolve({\n status: \"failed\",\n message: `${actualPdfBaseName}.pdf is not the same as ${baselinePdfBaseName}.pdf compared by their base64 values.`,\n });\n } else {\n resolve({ status: \"passed\" });\n }\n });\n};\n","import filter from \"lodash/filter\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { PNG } from \"pngjs\";\nimport pixelmatch from \"pixelmatch\";\nimport { ensureAndCleanupPath } from \"./utils\";\nimport type { ComparePdfConfig } from \"./config\";\nimport type { ComparePdfOptions } from \"./comparePdf\";\n\nexport interface PdfDetails {\n filename: string;\n buffer: Buffer;\n}\n\nexport interface CompareDetails {\n actualPdfFilename: string;\n baselinePdfFilename: string;\n actualPdfBuffer: Buffer;\n baselinePdfBuffer: Buffer;\n config: ComparePdfConfig;\n opts: ComparePdfOptions;\n}\n\nexport interface ComparisonResult {\n status: \"passed\" | \"failed\";\n numDiffPixels?: number;\n diffPng?: string;\n actual?: string;\n error?: Error;\n message?: string;\n details?: ComparisonResult[];\n}\n\nexport const comparePngs = async (\n actual: string,\n baseline: string,\n diff: string,\n config: CompareDetails[\"config\"],\n): Promise<ComparisonResult> => {\n return new Promise((resolve) => {\n try {\n const actualPng = PNG.sync.read(fs.readFileSync(actual));\n const baselinePng = PNG.sync.read(fs.readFileSync(baseline));\n const { width, height } = actualPng;\n const diffPng = new PNG({ width, height });\n\n const threshold = config.settings?.threshold ?? 0.05;\n const tolerance = config.settings?.tolerance ?? 0;\n\n const numDiffPixels = pixelmatch(\n actualPng.data,\n baselinePng.data,\n diffPng.data,\n width,\n height,\n {\n threshold,\n },\n );\n\n if (numDiffPixels > tolerance) {\n fs.writeFileSync(diff, PNG.sync.write(diffPng));\n resolve({ status: \"failed\", numDiffPixels, diffPng: diff });\n } else {\n resolve({ status: \"passed\" });\n }\n } catch (error) {\n resolve({ status: \"failed\", actual, error: error as Error });\n }\n });\n};\n\nexport const comparePdfByImage = async ({\n actualPdfFilename,\n baselinePdfFilename,\n actualPdfBuffer,\n baselinePdfBuffer,\n config,\n opts,\n}: CompareDetails): Promise<ComparisonResult> => {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: <explanation>\n return new Promise(async (resolve) => {\n try {\n const imageEngine = await import(\n config.settings.imageEngine === \"graphicsMagick\"\n ? \"./engines/graphicsMagick\"\n : \"./engines/native\"\n );\n\n const actualPdfBaseName = path.parse(actualPdfFilename).name;\n const baselinePdfBaseName = path.parse(baselinePdfFilename).name;\n\n if (\n config.paths.actualPngRootFolder &&\n config.paths.baselinePngRootFolder &&\n config.paths.diffPngRootFolder\n ) {\n const actualPngDirPath = `${config.paths.actualPngRootFolder}/${actualPdfBaseName}`;\n const baselinePngDirPath = `${config.paths.baselinePngRootFolder}/${baselinePdfBaseName}`;\n const diffPngDirPath = `${config.paths.diffPngRootFolder}/${actualPdfBaseName}`;\n\n ensureAndCleanupPath(actualPngDirPath);\n ensureAndCleanupPath(baselinePngDirPath);\n ensureAndCleanupPath(diffPngDirPath);\n\n const actualPngFilePath = `${actualPngDirPath}/${actualPdfBaseName}.png`;\n const baselinePngFilePath = `${baselinePngDirPath}/${baselinePdfBaseName}.png`;\n\n const actualPdfDetails: PdfDetails = {\n filename: actualPdfFilename,\n buffer: actualPdfBuffer,\n };\n await imageEngine.pdfToPng(actualPdfDetails, actualPngFilePath, config);\n\n const baselinePdfDetails: PdfDetails = {\n filename: baselinePdfFilename,\n buffer: baselinePdfBuffer,\n };\n await imageEngine.pdfToPng(\n baselinePdfDetails,\n baselinePngFilePath,\n config,\n );\n\n const actualPngs = fs\n .readdirSync(actualPngDirPath)\n .filter((pngFile) =>\n path.parse(pngFile).name.startsWith(actualPdfBaseName),\n );\n const baselinePngs = fs\n .readdirSync(baselinePngDirPath)\n .filter((pngFile) =>\n path.parse(pngFile).name.startsWith(baselinePdfBaseName),\n );\n\n if (config.settings.matchPageCount === true) {\n if (actualPngs.length !== baselinePngs.length) {\n resolve({\n status: \"failed\",\n message: `Actual pdf page count (${actualPngs.length}) is not the same as Baseline pdf (${baselinePngs.length}).`,\n });\n return;\n }\n }\n\n const comparisonResults: ComparisonResult[] = [];\n for (let index = 0; index < baselinePngs.length; index++) {\n let suffix = \"\";\n if (baselinePngs.length > 1) {\n suffix = `-${index}`;\n }\n\n const actualPng =\n actualPngs.length > 1\n ? `${actualPngDirPath}/${actualPdfBaseName}${suffix}.png`\n : `${actualPngDirPath}/${actualPdfBaseName}.png`;\n const baselinePng = `${baselinePngDirPath}/${baselinePdfBaseName}${suffix}.png`;\n const diffPng = `${diffPngDirPath}/${actualPdfBaseName}_diff${suffix}.png`;\n\n if (\n opts.skipPageIndexes?.length &&\n opts.skipPageIndexes.includes(index)\n ) {\n continue;\n }\n\n if (\n opts.onlyPageIndexes?.length &&\n !opts.onlyPageIndexes.includes(index)\n ) {\n continue;\n }\n\n if (opts.masks) {\n const pageMasks = filter(opts.masks, { pageIndex: index });\n if (pageMasks?.length) {\n for (const pageMask of pageMasks) {\n await imageEngine.applyMask(\n actualPng,\n pageMask.coordinates,\n pageMask.color,\n );\n await imageEngine.applyMask(\n baselinePng,\n pageMask.coordinates,\n pageMask.color,\n );\n }\n }\n }\n\n if (opts.crops?.length) {\n const pageCroppings = filter(opts.crops, { pageIndex: index });\n if (pageCroppings?.length) {\n for (\n let cropIndex = 0;\n cropIndex < pageCroppings.length;\n cropIndex++\n ) {\n await imageEngine.applyCrop(\n actualPng,\n pageCroppings[cropIndex]?.coordinates,\n cropIndex,\n );\n await imageEngine.applyCrop(\n baselinePng,\n pageCroppings[cropIndex]?.coordinates,\n cropIndex,\n );\n comparisonResults.push(\n await comparePngs(\n actualPng.replace(\".png\", `-${cropIndex}.png`),\n baselinePng.replace(\".png\", `-${cropIndex}.png`),\n diffPng,\n config,\n ),\n );\n }\n }\n } else {\n comparisonResults.push(\n await comparePngs(actualPng, baselinePng, diffPng, config),\n );\n }\n }\n\n if (config.settings.cleanPngPaths) {\n ensureAndCleanupPath(config.paths.actualPngRootFolder);\n ensureAndCleanupPath(config.paths.baselinePngRootFolder);\n }\n\n const failedResults = filter(\n comparisonResults,\n (res) => res.status === \"failed\",\n );\n if (failedResults.length > 0) {\n resolve({\n status: \"failed\",\n message: `${actualPdfBaseName}.pdf is not the same as ${baselinePdfBaseName}.pdf compared by their images.`,\n details: failedResults,\n });\n } else {\n resolve({ status: \"passed\" });\n }\n } else {\n resolve({\n status: \"failed\",\n message:\n \"PNG directory is not set. Please define correctly then try again.\",\n });\n }\n } catch (error) {\n resolve({\n status: \"failed\",\n message: `An error occurred.\\n${error}`,\n });\n }\n });\n};\n","import path from \"node:path\";\n\nexport interface ConfigPaths {\n actualPdfRootFolder: string;\n baselinePdfRootFolder: string;\n actualPngRootFolder: string;\n baselinePngRootFolder: string;\n diffPngRootFolder: string;\n}\n\nexport interface ConfigSettings {\n imageEngine: \"graphicsMagick\" | \"native\";\n density: number;\n quality: number;\n tolerance: number;\n threshold: number;\n cleanPngPaths?: boolean;\n matchPageCount?: boolean;\n disableFontFace?: boolean;\n verbosity?: number;\n}\n\nexport interface ComparePdfConfig {\n paths: ConfigPaths;\n settings: ConfigSettings;\n}\n\nconst config = {\n paths: {\n actualPdfRootFolder: path.resolve(process.cwd(), \"data/actualPdfs\"),\n baselinePdfRootFolder: path.join(process.cwd(), \"data/baselinePdfs\"),\n actualPngRootFolder: path.join(process.cwd(), \"data/actualPngs\"),\n baselinePngRootFolder: path.join(process.cwd(), \"data/baselinePngs\"),\n diffPngRootFolder: path.join(process.cwd(), \"data/diffPngs\"),\n },\n settings: {\n imageEngine: \"graphicsMagick\" as const,\n density: 100,\n quality: 70,\n tolerance: 0,\n threshold: 0.05,\n cleanPngPaths: false,\n matchPageCount: true,\n disableFontFace: true,\n verbosity: 0,\n },\n} as const satisfies ComparePdfConfig;\n\nexport default config;\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { copyJsonObject, ensurePathsExist } from \"./utils\";\nimport { comparePdfByBase64 } from \"./compareData\";\nimport { comparePdfByImage, type CompareDetails } from \"./compareImages\";\nimport defaultConfig, { type ComparePdfConfig } from \"./config\";\n\nexport interface Coordinates {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\nexport interface PageMask {\n pageIndex: number;\n coordinates: Coordinates;\n color?: string;\n}\n\nexport interface Dimension {\n width: number;\n height: number;\n x: number;\n y: number;\n}\n\nexport interface PageCrop {\n pageIndex: number;\n coordinates: Dimension;\n}\n\nexport interface ComparePdfOptions {\n masks: PageMask[];\n crops: PageCrop[];\n onlyPageIndexes: number[];\n skipPageIndexes: number[];\n}\n\nexport interface Details {\n status: string;\n numDiffPixels: string;\n diffPng: string;\n}\n\nexport interface Results {\n status: string;\n message: string;\n details?: Details[];\n}\n\nexport interface CompareResult {\n status: \"not executed\" | \"failed\" | \"passed\";\n message?: string;\n details?: Array<{\n status: string;\n numDiffPixels?: number;\n diffPng?: string;\n actual?: string;\n error?: Error;\n }>;\n}\n\nexport type ComparisonType = \"byBase64\" | \"byImage\";\n\nexport class ComparePdf {\n private config: ComparePdfConfig;\n private opts: ComparePdfOptions;\n private result: CompareResult;\n private baselinePdfBufferData?: Buffer;\n private actualPdfBufferData?: Buffer;\n private baselinePdf?: string;\n private actualPdf?: string;\n\n constructor(config: ComparePdfConfig = copyJsonObject(defaultConfig)) {\n this.config = config;\n ensurePathsExist(this.config);\n\n this.opts = {\n masks: [],\n crops: [],\n onlyPageIndexes: [],\n skipPageIndexes: [],\n };\n\n this.result = {\n status: \"not executed\",\n };\n }\n\n baselinePdfBuffer(\n baselinePdfBuffer: Buffer,\n baselinePdfFilename?: string,\n ): this {\n if (baselinePdfBuffer) {\n this.baselinePdfBufferData = baselinePdfBuffer;\n if (baselinePdfFilename) {\n this.baselinePdf = baselinePdfFilename;\n }\n } else {\n this.result = {\n status: \"failed\",\n message:\n \"Baseline pdf buffer is invalid or filename is missing. Please define correctly then try again.\",\n };\n }\n return this;\n }\n\n baselinePdfFile(baselinePdf: string): this {\n if (baselinePdf) {\n const baselinePdfBaseName = path.parse(baselinePdf).name;\n if (fs.existsSync(baselinePdf)) {\n this.baselinePdf = baselinePdf;\n } else if (\n fs.existsSync(\n `${this.config.paths.baselinePdfRootFolder}/${baselinePdfBaseName}.pdf`,\n )\n ) {\n this.baselinePdf = `${this.config.paths.baselinePdfRootFolder}/${baselinePdfBaseName}.pdf`;\n } else {\n this.result = {\n status: \"failed\",\n message:\n \"Baseline pdf file path does not exists. Please define correctly then try again.\",\n };\n }\n } else {\n this.result = {\n status: \"failed\",\n message:\n \"Baseline pdf file path was not set. Please define correctly then try again.\",\n };\n }\n return this;\n }\n\n actualPdfBuffer(actualPdfBuffer: Buffer, actualPdfFilename?: string): this {\n if (actualPdfBuffer) {\n this.actualPdfBufferData = actualPdfBuffer;\n if (actualPdfFilename) {\n this.actualPdf = actualPdfFilename;\n }\n } else {\n this.result = {\n status: \"failed\",\n message:\n \"Actual pdf buffer is invalid or filename is missing. Please define correctly then try again.\",\n };\n }\n return this;\n }\n\n actualPdfFile(actualPdf: string): this {\n if (actualPdf) {\n const actualPdfBaseName = path.parse(actualPdf).name;\n if (fs.existsSync(actualPdf)) {\n this.actualPdf = actualPdf;\n } else if (\n fs.existsSync(\n `${this.config.paths.actualPdfRootFolder}/${actualPdfBaseName}.pdf`,\n )\n ) {\n this.actualPdf = `${this.config.paths.actualPdfRootFolder}/${actualPdfBaseName}.pdf`;\n } else {\n this.result = {\n status: \"failed\",\n message:\n \"Actual pdf file path does not exists. Please define correctly then try again.\",\n };\n }\n } else {\n this.result = {\n status: \"failed\",\n message:\n \"Actual pdf file path was not set. Please define correctly then try again.\",\n };\n }\n return this;\n }\n\n addMask(\n pageIndex: number,\n coordinates = { x0: 0, y0: 0, x1: 0, y1: 0 },\n color = \"black\",\n ): this {\n this.opts.masks.push({\n pageIndex,\n coordinates,\n color,\n });\n return this;\n }\n\n addMasks(masks: ComparePdfOptions[\"masks\"]): this {\n this.opts.masks = [...this.opts.masks, ...masks];\n return this;\n }\n\n onlyPageIndexes(pageIndexes: number[]): this {\n this.opts.onlyPageIndexes = [...this.opts.onlyPageIndexes, ...pageIndexes];\n return this;\n }\n\n skipPageIndexes(pageIndexes: number[]): this {\n this.opts.skipPageIndexes = [...this.opts.skipPageIndexes, ...pageIndexes];\n return this;\n }\n\n cropPage(\n pageIndex: number,\n coordinates = { width: 0, height: 0, x: 0, y: 0 },\n ): this {\n this.opts.crops.push({\n pageIndex,\n coordinates,\n });\n return this;\n }\n\n cropPages(cropPagesList: ComparePdfOptions[\"crops\"]): this {\n this.opts.crops = [...this.opts.crops, ...cropPagesList];\n return this;\n }\n\n async compare(\n comparisonType: ComparisonType = \"byImage\",\n ): Promise<CompareResult> {\n if (\n this.result.status === \"not executed\" ||\n this.result.status !== \"failed\"\n ) {\n if (!this.actualPdf || !this.baselinePdf) {\n throw new Error(\"PDF files not properly initialized\");\n }\n\n const compareDetails = {\n actualPdfFilename: this.actualPdf,\n baselinePdfFilename: this.baselinePdf,\n actualPdfBuffer:\n this.actualPdfBufferData ?? fs.readFileSync(this.actualPdf),\n baselinePdfBuffer:\n this.baselinePdfBufferData ?? fs.readFileSync(this.baselinePdf),\n config: this.config,\n opts: this.opts,\n } satisfies CompareDetails;\n\n switch (comparisonType) {\n case \"byBase64\":\n this.result = await comparePdfByBase64(compareDetails);\n break;\n default:\n this.result = await comparePdfByImage(compareDetails);\n break;\n }\n }\n return this.result;\n }\n}\n\nexport default ComparePdf;\n"]}