UNPKG

@maximegirardet/merge-pdfs

Version:

Merging PDF (with Outline).

130 lines (119 loc) 4.06 kB
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 };