@bader-nasser/pdftools
Version:
PDF tools to manipulate and process PDF files
129 lines (128 loc) • 4.6 kB
JavaScript
import { Args, Flags } from '@oclif/core';
import { addExtension, removeExtension,
// Removing the extension will make the built cli crash
} from '../../utils.js';
import { BaseCommand } from '../../base-command.js';
export default class Linearize extends BaseCommand {
static aliases = ['l', 'optimize', 'o'];
static description = `Optimize for web browsers [mutool]`;
static examples = [
'<%= config.bin %> <%= command.id %> input.pdf',
'<%= config.bin %> <%= command.id %> input.pdf -o input-linearized.pdf',
];
static args = {
input: Args.string({
description: `Input PDF file`,
required: true,
}),
};
static flags = {
output: Flags.string({
char: 'o',
description: 'Output file',
}),
decompress: Flags.boolean({
char: 'd',
description: 'Decompress all streams (except compress-fonts/images)',
exclusive: ['compress', 'compress-fonts', 'compress-images'],
}),
compress: Flags.boolean({
char: 'c',
description: 'Compress all streams',
exclusive: ['decompress'],
}),
'compress-fonts': Flags.boolean({
char: 'F',
aliases: ['cf'],
description: 'Compress embedded fonts (ALIASES: --cf)',
exclusive: ['decompress'],
}),
'compress-images': Flags.boolean({
char: 'I',
aliases: ['ci'],
description: 'Compress images (ALIASES: --ci)',
exclusive: ['decompress'],
}),
garbage: Flags.boolean({
char: 'g',
description: 'Garbage collect unused objects',
}),
'garbage-compact': Flags.boolean({
char: 'C',
aliases: ['compact', 'gc'],
description: '... and compact cross reference table (ALIASES: --gc, --compact)',
}),
'garbage-deduplicate': Flags.boolean({
char: 'G',
aliases: ['deduplicate', 'gd'],
description: '... and remove duplicate objects (ALIASES: --gd, --deduplicate)',
}),
keep: Flags.boolean({
char: 'k',
description: `Keep output's name`,
}),
};
async run() {
const { args, flags } = await this.parse(Linearize);
const { input } = args;
const { output, 'dry-run': dryRun, silent, decompress, compress, 'compress-fonts': compressFonts, 'compress-images': compressImages, garbage, 'garbage-compact': garbageCompact, 'garbage-deduplicate': garbageDeduplicate, keep, } = flags;
let finalOutput;
if (output) {
finalOutput = removeExtension(output);
}
else {
finalOutput = removeExtension(input);
finalOutput = `${finalOutput}-linearized`;
}
const outputOptions = ['linearize'];
if (compress) {
outputOptions.push('compress');
if (!keep) {
finalOutput = `${finalOutput}-compressed`;
}
}
if (compressFonts) {
outputOptions.push('compress-fonts');
if (!keep) {
finalOutput = `${finalOutput}-cf`;
}
}
if (compressImages) {
outputOptions.push('compress-images');
if (!keep) {
finalOutput = `${finalOutput}-ci`;
}
}
if (decompress) {
outputOptions.push('decompress');
if (!keep) {
finalOutput = `${finalOutput}-decompressed`;
}
}
if (garbage || garbageCompact || garbageDeduplicate) {
outputOptions.push('garbage');
if (!keep) {
finalOutput = `${finalOutput}-garbaged`;
}
}
if (garbageCompact) {
outputOptions.push('garbage=compact');
if (!keep) {
finalOutput = `${finalOutput}-gc`;
}
}
if (garbageDeduplicate) {
outputOptions.push('garbage=deduplicate');
if (!keep) {
finalOutput = `${finalOutput}-gd`;
}
}
finalOutput = addExtension(finalOutput);
await this.ensureDirExists(finalOutput);
this.logger(`Creating ${finalOutput}...`, silent);
const args2 = ['convert', '-o', finalOutput];
args2.push('-O', outputOptions.join(','), input);
await this.execute('mutool', args2, dryRun);
this.logger('Done.', silent);
}
}