@maximegirardet/merge-pdfs
Version:
Merging PDF (with Outline).
155 lines (144 loc) • 6.21 kB
JavaScript
;
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/mergePDFs.ts
var mergePDFs_exports = {};
__export(mergePDFs_exports, {
MERGE_PDF_NAME: () => MERGE_PDF_NAME,
MOUNT_DIR: () => MOUNT_DIR,
default: () => mergePDFs_default,
mergePDFs: () => mergePDFs
});
module.exports = __toCommonJS(mergePDFs_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/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);
// package.json
var name = "@maximegirardet/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");
// 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}'`;
}
// src/mergePDFs.ts
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;
}
var mergePDFs_default = mergePDFs;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
MERGE_PDF_NAME,
MOUNT_DIR,
mergePDFs
});