UNPKG

pdf-export-images

Version:

exports images from a pdf file to disk via CLI

70 lines 3.28 kB
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()); }); }; import EventEmitter from 'node:events'; import Path from 'node:path'; import { getDocument, OPS } from 'pdfjs-dist'; import sharp from 'sharp'; export function exportImagesEvents(src, dst = '.') { const ee = new EventEmitter(); getDocument(src).promise .then(doc => processDoc(doc, dst, ee)) .catch(error => ee.emit('error', error)); return ee; } export function exportImages(src, dst = '.') { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { exportImagesEvents(src, dst) .on('done', resolve) .on('error', reject); }); }); } function processDoc(doc, dst, ee) { return __awaiter(this, void 0, void 0, function* () { const pageCount = doc._pdfInfo.numPages; ee.emit('load', { pageCount }); const images = []; for (let p = 1; p <= pageCount; p++) { const page = yield doc.getPage(p); const ops = yield page.getOperatorList(); for (let i = 0; i < ops.fnArray.length; i++) { try { if (ops.fnArray[i] === OPS.paintImageXObject || ops.fnArray[i] === OPS.paintInlineImageXObject) { const name = ops.argsArray[i][0]; const common = yield page.commonObjs.has(name); const img = yield (common ? page.commonObjs.get(name) : page.objs.get(name)); const { width, height, kind } = img; const bytes = img.data.length; const channels = bytes / width / height; if (!(channels === 1 || channels === 2 || channels === 3 || channels === 4)) { throw new Error(`Invalid image channel: ${channels} for image ${name} on page ${page}`); } const file = Path.join(dst, `${name}.png`); yield sharp(img.data, { raw: { width, height, channels } }).toFile(file); const event = { name, kind, width, height, channels, bytes, file }; ee.emit('image', event); images.push(event); } } catch (error) { ee.emit('error', error); } } } ee.emit('done', images); }); } //# sourceMappingURL=index.js.map