pdf-visual-diff
Version:
Visual Regression Testing for PDFs in JavaScript
67 lines • 3.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pdf2png = pdf2png;
const fs = require("node:fs/promises");
const path = require("node:path");
const jimp_1 = require("jimp");
const types_1 = require("../types");
const conversions_1 = require("../conversions");
// pdfjs location
const PDFJS_DIR = path.join(path.dirname(require.resolve('pdfjs-dist')), '..');
const DOCUMENT_INIT_PARAMS_DEFAULTS = {
// Where the standard fonts are located.
standardFontDataUrl: path.join(PDFJS_DIR, 'standard_fonts/'),
// Some PDFs need external cmaps.
cMapUrl: path.join(PDFJS_DIR, 'cmaps/'),
cMapPacked: true,
};
const pdf2PngDefOpts = {
dpi: types_1.Dpi.High,
};
const PDF_DPI = 72;
function getPageViewPort(page, dpi) {
const dpiNum = dpi === types_1.Dpi.Low ? PDF_DPI : dpi === types_1.Dpi.High ? 144 : dpi;
const viewport = page.getViewport({ scale: 1.0 });
if (dpiNum === PDF_DPI) {
return viewport;
}
// Increase resolution
const horizontalMm = (0, conversions_1.convertFromPxToMm)(viewport.width, PDF_DPI);
const verticalMm = (0, conversions_1.convertFromPxToMm)(viewport.height, PDF_DPI);
const actualWidth = (0, conversions_1.convertFromMmToPx)(horizontalMm, dpiNum);
const actualHeight = (0, conversions_1.convertFromMmToPx)(verticalMm, dpiNum);
const scale = Math.min(actualWidth / viewport.width, actualHeight / viewport.height);
return page.getViewport({ scale });
}
function mkPdfPagesRenderer(pdfDocument, dpi) {
return async function (toImage, toJimpInstances) {
const images = [];
const totalPages = pdfDocument.numPages;
for (let idx = 1; idx <= totalPages; idx += 1) {
const page = await pdfDocument.getPage(idx);
const canvasFactory = pdfDocument.canvasFactory;
const viewport = getPageViewPort(page, dpi);
// @ts-expect-error unknown method on Object
const canvasAndContext = canvasFactory.create(viewport.width, viewport.height);
const renderParameters = {
canvasContext: canvasAndContext.context,
viewport,
};
await page.render(renderParameters).promise;
images.push(toImage(canvasAndContext.canvas));
page.cleanup();
}
return toJimpInstances(images);
};
}
async function pdf2png(pdf, options = {}) {
const { getDocument } = await import('pdfjs-dist/legacy/build/pdf.mjs');
const opts = Object.assign(Object.assign({}, pdf2PngDefOpts), options);
// Load PDF
const pdfBuffer = Buffer.isBuffer(pdf) ? pdf : await fs.readFile(pdf);
const loadingTask = getDocument(Object.assign(Object.assign({}, DOCUMENT_INIT_PARAMS_DEFAULTS), { data: new Uint8Array(pdfBuffer) }));
const pdfDocument = await loadingTask.promise;
const renderPdfPages = mkPdfPagesRenderer(pdfDocument, opts.dpi);
return renderPdfPages((canvas) => canvas.toBuffer('image/png'), (images) => Promise.all(images.map((x) => jimp_1.Jimp.read(x).then((x) => x))));
}
//# sourceMappingURL=pdf2png.js.map