pdf-export-images
Version:
exports images from a pdf file to disk via CLI
70 lines • 3.28 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());
});
};
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