UNPKG

@maximegirardet/merge-pdfs

Version:

Merging PDF (with Outline).

194 lines (181 loc) 7.5 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { MERGE_PDF_NAME: () => MERGE_PDF_NAME, MOUNT_DIR: () => MOUNT_DIR, PKG_NAME: () => PKG_NAME, formatDate: () => formatDate, mergePDFs: () => mergePDFs, mergePdfsCli: () => mergePdfsCli, runCli: () => runCli }); module.exports = __toCommonJS(src_exports); // node_modules/tsup/assets/cjs_shims.js var getImportMetaUrl = () => typeof document === "undefined" ? new URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href; var importMetaUrl = /* @__PURE__ */ getImportMetaUrl(); // src/constants/bin.ts var PKG_NAME = "merge-pdfs"; // src/commands/mergePdfsCli.ts var import_node_path = require("path"); var import_node_fs = require("fs"); var import_yargs = __toESM(require("yargs"), 1); var import_helpers = require("yargs/helpers"); var import_colorette = require("colorette"); // package.json var name = "@maximegirardet/merge-pdfs"; var version = "0.0.11"; // src/commands/mergePdfsCli.ts async function mergePdfsCli() { const program = (0, import_yargs.default)((0, import_helpers.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"; (0, import_node_fs.writeFileSync)(output, outBuffer); process.stdout.write((0, import_colorette.greenBright)(` Saved to ${(0, import_node_path.join)(process.cwd(), argv.o)} `)); } // src/commands/runner.ts function runCli(programName) { if (programName === PKG_NAME) mergePdfsCli(); } // src/mergePDFs.ts var import_node_url = require("url"); var import_node_process = __toESM(require("process"), 1); var import_node_fs2 = require("fs"); var import_node_path2 = require("path"); var import_node_os = require("os"); var path = __toESM(require("path"), 1); var import_colorette2 = require("colorette"); var import_fast_glob = __toESM(require("fast-glob"), 1); var isWindows = (0, import_node_os.platform)() === "win32"; var isLinux = (0, import_node_os.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 __dirname = CLIPath ?? (0, import_node_path2.dirname)((0, import_node_url.fileURLToPath)(importMetaUrl)); const dir = import_node_process.default.cwd(); let absolutePathArr = entry; if (isLinux) { absolutePathArr = import_fast_glob.default.sync(entry, { ignore: ["node_modules"], onlyFiles: true, cwd: dir, absolute: true }).filter((file) => (0, import_node_path2.extname)(file) === ".pdf"); } if (absolutePathArr.length < 2) { import_node_process.default.stdout.write((0, import_colorette2.yellowBright)("At least two PDF files.\n")); import_node_process.default.exit(1); } const { loadPyodide } = await import(path.join((0, import_node_path2.resolve)(__dirname, "pyodide"), "pyodide.js")); const pyodide = await loadPyodide({ indexURL: (0, import_node_path2.resolve)(__dirname, "pyodide") }); await pyodide.loadPackage("micropip"); const micropip = pyodide.pyimport("micropip"); pyodide.FS.mkdir(MOUNT_DIR); pyodide.FS.mount(pyodide.FS.filesystems.NODEFS, { root: __dirname }, 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, (0, import_node_fs2.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; } // src/formatDate.ts function formatDate(date) { const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); const paddedMonth = `00${month}`.slice(-2); const paddedDay = `00${day}`.slice(-2); const paddedHour = `00${hour}`.slice(-2); const paddedMinute = `00${minute}`.slice(-2); const paddedSecond = `00${second}`.slice(-2); const str = `D:${year}${paddedMonth}${paddedDay}${paddedHour}${paddedMinute}${paddedSecond}`; let offset = date.getTimezoneOffset(); const rel = offset === 0 ? "Z" : offset > 0 ? "-" : "+"; offset = Math.abs(offset); const hoursOffset = Math.floor(offset / 60); const minutesOffset = offset - hoursOffset * 60; const paddedHoursOffset = `00${hoursOffset}`.slice(-2); const paddedMinutesOffset = `00${minutesOffset}`.slice(-2); return `${str}${rel}${paddedHoursOffset}'${paddedMinutesOffset}'`; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { MERGE_PDF_NAME, MOUNT_DIR, PKG_NAME, formatDate, mergePDFs, mergePdfsCli, runCli });