@maximegirardet/merge-pdfs
Version:
Merging PDF (with Outline).
130 lines (119 loc) • 4.06 kB
JavaScript
import {
formatDate
} from "./chunk-5FVHUK32.js";
import {
PKG_NAME
} from "./chunk-APFQJI4D.js";
// src/commands/mergePdfsCli.ts
import { join as join2 } from "node:path";
import { writeFileSync } from "node:fs";
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { greenBright } from "colorette";
// src/commands/runner.ts
function runCli(programName) {
if (programName === PKG_NAME)
mergePdfsCli();
}
// src/mergePDFs.ts
import { fileURLToPath } from "node:url";
import process2 from "node:process";
import { readFileSync } from "node:fs";
import { dirname, extname, resolve } from "node:path";
import { platform } from "node:os";
import * as path from "node:path";
import { yellowBright } from "colorette";
import fg from "fast-glob";
// package.json
var name = "@maximegirardet/merge-pdfs";
var version = "0.0.11";
// src/mergePDFs.ts
var isWindows = platform() === "win32";
var isLinux = platform() === "linux";
var MERGE_PDF_NAME = "66699f18-ad5a-43c2-a96e-97bddaef0e6b.pdf";
var MOUNT_DIR = "/991e729a-8f2e-472a-8402-c26bb03b5ea3";
async function mergePDFs(entry, CLIPath = null) {
const __dirname2 = CLIPath ?? dirname(fileURLToPath(import.meta.url));
const dir = process2.cwd();
let absolutePathArr = entry;
if (isLinux) {
absolutePathArr = fg.sync(entry, {
ignore: ["node_modules"],
onlyFiles: true,
cwd: dir,
absolute: true
}).filter((file) => extname(file) === ".pdf");
}
if (absolutePathArr.length < 2) {
process2.stdout.write(yellowBright("At least two PDF files.\n"));
process2.exit(1);
}
const { loadPyodide } = await import(path.join(resolve(__dirname2, "pyodide"), "pyodide.js"));
const pyodide = await loadPyodide({ indexURL: resolve(__dirname2, "pyodide") });
await pyodide.loadPackage("micropip");
const micropip = pyodide.pyimport("micropip");
pyodide.FS.mkdir(MOUNT_DIR);
pyodide.FS.mount(pyodide.FS.filesystems.NODEFS, { root: __dirname2 }, MOUNT_DIR);
await micropip.install(`emfs:${MOUNT_DIR}/pyodide/pypdf-3.8.1-py3-none-any.whl`);
const tempFileNameArr = [];
absolutePathArr.forEach((filePath) => {
let tempFileName = `/${filePath.split("/").join("-")}`;
if (isWindows)
tempFileName = `/${filePath.split("\\").join("-")}`;
tempFileNameArr.push(tempFileName);
pyodide.FS.writeFile(tempFileName, readFileSync(filePath), { encoding: "utf8" });
});
const curDate = formatDate(/* @__PURE__ */ new Date());
await pyodide.runPythonAsync(`
from pypdf import PdfWriter
from json import loads
writer = PdfWriter()
writer.add_metadata(
{
"/CreationDate": "${curDate}",
"/ModDate": "${curDate}",
"/Creator": "${name}",
"/Producer": "pypdf - ${name}",
}
)
for path in loads('${JSON.stringify(tempFileNameArr)}'):
writer.append(path)
writer.write("/${MERGE_PDF_NAME}")
writer.close()
`);
const outBuffer = pyodide.FS.readFile(`/${MERGE_PDF_NAME}`);
return outBuffer;
}
var mergePDFs_default = mergePDFs;
// src/commands/mergePdfsCli.ts
async function mergePdfsCli() {
const program = yargs(hideBin(process.argv)).scriptName(name).usage("$0 <entry...>").option("o", {
alias: "output",
default: "merged-pdf.pdf",
describe: "Output file",
type: "string",
demandOption: false
}).example([
["$0 1.pdf 2.pdf", "Merge two PDFs files"],
["$0 1.pdf 2.pdf -o merged-pdf.pdf", "Merge two PDFs files into merged-pdf.pdf file"],
["$0 pdfs/*.pdf -o merged-pdf.pdf", "Merge some PDFs files into merged-pdf.pdf file"]
]).showHelpOnFail(false).alias("h", "help").version("version", version).alias("v", "version").help();
const argv = await program.argv;
const entry = argv._;
let output = argv.o;
const outBuffer = await mergePDFs(entry);
if (!output.endsWith(".pdf"))
output += ".pdf";
writeFileSync(output, outBuffer);
process.stdout.write(greenBright(`
Saved to ${join2(process.cwd(), argv.o)}
`));
}
export {
mergePdfsCli,
runCli,
MERGE_PDF_NAME,
MOUNT_DIR,
mergePDFs,
mergePDFs_default
};