printmaker
Version:
Generate PDF documents and from JavaScript objects
71 lines (61 loc) • 2.47 kB
JavaScript
/* eslint-disable no-console */
import { mkdir, readdir, readFile, stat, writeFile } from 'fs/promises';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
import wawoff2 from 'wawoff2';
import { makePdf } from '../dist/index.js';
const fontsOutputFile = 'examples/generated/fonts.js';
const pkgRoot = dirname(fileURLToPath(import.meta.url));
const fontSourceRoot = join(pkgRoot, '../node_modules/@fontsource');
const fonts = {
DejaVu_Sans_Normal: 'dejavu-sans/files/dejavu-sans-latin-400-normal.woff2',
DejaVu_Sans_Italic: 'dejavu-sans/files/dejavu-sans-latin-400-italic.woff2',
DejaVu_Sans_Bold: 'dejavu-sans/files/dejavu-sans-latin-700-normal.woff2',
DejaVu_Sans_BoldItalic: 'dejavu-sans/files/dejavu-sans-latin-700-italic.woff2',
};
main().catch((error) => {
console.error(error);
process.exit(1);
});
async function main() {
const stats = await stat(fontsOutputFile).catch(() => null);
if (!stats?.isFile()) {
await makeFonts();
}
const files = await readdir('examples', { withFileTypes: true });
for (const file of files.filter((f) => f.isFile() && f.name.endsWith('.js'))) {
await makeExample(makePdf, join('examples', file.name));
}
}
async function makeFonts() {
await mkdir(dirname(fontsOutputFile), { recursive: true });
const entries = [];
for (const [name, location] of Object.entries(fonts)) {
const input = await readFile(join(fontSourceRoot, location));
const data = await wawoff2.decompress(input);
const base64 = Buffer.from(data).toString('base64');
entries.push(` ${name}:\n '${base64}',`);
}
const lines = ['// generated file', 'export default {', ...entries, '};'];
await writeFile(fontsOutputFile, lines.join('\n') + '\n');
}
async function makeExample(makePdf, path) {
const name = path.replace(/^.*\/(.*)\.[a-z]+$/, '$1');
const example = await importExample(join('..', path));
if (example.default) {
const start = Date.now();
const result = await makePdf(example.default);
const duration = Date.now() - start;
const outfile = join('out', name + '.pdf');
await mkdir('out', { recursive: true });
await writeFile(join('out', name + '.pdf'), result);
console.log(`created ${outfile} with ${result.byteLength} bytes (${duration} ms)`);
}
}
async function importExample(path) {
try {
return await import(join(path));
} catch (error) {
console.error('could not import example: ' + path, error);
}
}