@tomatrow/pdf-to-png-converter
Version:
Node.js utility to convert PDF file/buffer pages to PNG files/buffers with no native dependencies.
74 lines (73 loc) • 4.34 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.pdfToPng = pdfToPng;
const node_fs_1 = require("node:fs");
const node_path_1 = require("node:path");
const const_1 = require("./const");
const props_to_pdf_doc_init_params_1 = require("./props.to.pdf.doc.init.params");
function pdfToPng(pdfFilePathOrBuffer, props) {
return __awaiter(this, void 0, void 0, function* () {
const isBuffer = Buffer.isBuffer(pdfFilePathOrBuffer);
const pdfFileBuffer = isBuffer
? pdfFilePathOrBuffer
: yield node_fs_1.promises.readFile(pdfFilePathOrBuffer);
const pdfDocInitParams = Object.assign(Object.assign({}, (0, props_to_pdf_doc_init_params_1.propsToPdfDocInitParams)(props)), { data: new Uint8Array(pdfFileBuffer) });
const { getDocument } = yield import('pdfjs-dist/legacy/build/pdf.mjs');
const pdfDocument = yield getDocument(pdfDocInitParams).promise;
const canvasFactory = pdfDocument.canvasFactory;
const targetedPageNumbers = (props === null || props === void 0 ? void 0 : props.pagesToProcess) !== undefined
? props.pagesToProcess
: Array.from({ length: pdfDocument.numPages }, (_, index) => index + 1);
if ((props === null || props === void 0 ? void 0 : props.strictPagesToProcess) && targetedPageNumbers.some((pageNum) => pageNum < 1)) {
throw new Error('Invalid pages requested, page number must be >= 1');
}
if ((props === null || props === void 0 ? void 0 : props.strictPagesToProcess) && targetedPageNumbers.some((pageNum) => pageNum > pdfDocument.numPages)) {
throw new Error('Invalid pages requested, page number must be <= total pages');
}
if (props === null || props === void 0 ? void 0 : props.outputFolder) {
yield node_fs_1.promises.mkdir(props.outputFolder, { recursive: true });
}
const pngPagesOutput = [];
for (const pageNumber of targetedPageNumbers) {
if (pageNumber > pdfDocument.numPages || pageNumber < 1) {
continue;
}
const page = yield pdfDocument.getPage(pageNumber);
const viewport = page.getViewport({
scale: (props === null || props === void 0 ? void 0 : props.viewportScale) !== undefined ? props.viewportScale : const_1.PDF_TO_PNG_OPTIONS_DEFAULTS.viewportScale,
});
const { canvas, context } = canvasFactory.create(viewport.width, viewport.height);
const name = (props === null || props === void 0 ? void 0 : props.outputFileMaskFunc)
? props.outputFileMaskFunc(pageNumber)
: `${isBuffer
? const_1.PDF_TO_PNG_OPTIONS_DEFAULTS.outputFileMask
: (0, node_path_1.parse)(pdfFilePathOrBuffer).name}_page_${pageNumber}.png`;
yield page.render({ canvasContext: context, viewport }).promise;
const pngPageOutput = {
pageNumber,
name,
content: canvas.toBuffer(),
path: '',
width: viewport.width,
height: viewport.height,
};
if (props === null || props === void 0 ? void 0 : props.outputFolder) {
pngPageOutput.path = (0, node_path_1.resolve)(props.outputFolder, pngPageOutput.name);
yield node_fs_1.promises.writeFile(pngPageOutput.path, pngPageOutput.content);
}
pngPagesOutput.push(pngPageOutput);
page.cleanup();
}
yield pdfDocument.cleanup();
return pngPagesOutput;
});
}