diff mupdf-source/source/tools/mutool.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/source/tools/mutool.c	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,183 @@
+// Copyright (C) 2004-2025 Artifex Software, Inc.
+//
+// This file is part of MuPDF.
+//
+// MuPDF is free software: you can redistribute it and/or modify it under the
+// terms of the GNU Affero General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
+// details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
+//
+// Alternative licensing terms are available from the licensor.
+// For commercial licensing, see <https://www.artifex.com/> or contact
+// Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
+// CA 94129, USA, for further information.
+
+/*
+ * mutool -- swiss army knife of pdf manipulation tools
+ */
+
+#include "mupdf/fitz.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#ifdef _MSC_VER
+#define main main_utf8
+#endif
+
+int muconvert_main(int argc, char *argv[]);
+int mudraw_main(int argc, char *argv[]);
+int mutrace_main(int argc, char *argv[]);
+int murun_main(int argc, char *argv[]);
+
+int pdfclean_main(int argc, char *argv[]);
+int pdfextract_main(int argc, char *argv[]);
+int pdfinfo_main(int argc, char *argv[]);
+int pdfposter_main(int argc, char *argv[]);
+int pdfshow_main(int argc, char *argv[]);
+int pdfpages_main(int argc, char *argv[]);
+int pdfcreate_main(int argc, char *argv[]);
+int pdfmerge_main(int argc, char *argv[]);
+int pdfsign_main(int argc, char *argv[]);
+int pdfrecolor_main(int argc, char *argv[]);
+int pdftrim_main(int argc, char *argv[]);
+int pdfbake_main(int argc, char *argv[]);
+int mubar_main(int argc, char *argv[]);
+
+int cmapdump_main(int argc, char *argv[]);
+int pdfaudit_main(int argc, char *argv[]);
+
+static struct {
+	int (*func)(int argc, char *argv[]);
+	char *name;
+	char *desc;
+} tools[] = {
+#if FZ_ENABLE_JS
+	{ murun_main, "run", "run javascript" },
+#endif
+	{ mudraw_main, "draw", "convert document" },
+	{ muconvert_main, "convert", "convert document (with simpler options)" },
+#if FZ_ENABLE_PDF
+	{ pdfaudit_main, "audit", "produce usage stats from PDF files" },
+	{ pdfbake_main, "bake", "bake PDF form into static content" },
+	{ pdfclean_main, "clean", "rewrite PDF file" },
+	{ pdfcreate_main, "create", "create PDF document" },
+	{ pdfextract_main, "extract", "extract font and image resources" },
+	{ pdfinfo_main, "info", "show information about PDF resources" },
+	{ pdfmerge_main, "merge", "merge pages from multiple PDF sources into a new PDF" },
+	{ pdfpages_main, "pages", "show information about PDF pages" },
+	{ pdfposter_main, "poster", "split large PDF page into many tiles" },
+	{ pdfrecolor_main, "recolor", "change colorspace of PDF document" },
+	{ pdfshow_main, "show", "show internal PDF objects" },
+	{ pdfsign_main, "sign", "manipulate PDF digital signatures" },
+	{ pdftrim_main, "trim", "trim PDF page contents" },
+#ifndef NDEBUG
+	{ cmapdump_main, "cmapdump", "dump CMap resource as C source file" },
+#endif
+#endif
+	{ mutrace_main, "trace", "trace device calls" },
+#if FZ_ENABLE_BARCODE
+	{ mubar_main, "barcode", "encode/decode barcodes" },
+#endif
+};
+
+static int
+namematch(const char *end, const char *start, const char *match)
+{
+	size_t len = strlen(match);
+	return ((end-len >= start) && (strncmp(end-len, match, len) == 0));
+}
+
+#ifdef GPERF
+#include "gperftools/profiler.h"
+
+static int profiled_main(int argc, char **argv);
+
+int main(int argc, char **argv)
+{
+	int ret;
+	ProfilerStart("mutool.prof");
+	ret = profiled_main(argc, argv);
+	ProfilerStop();
+	return ret;
+}
+
+static int profiled_main(int argc, char **argv)
+#else
+int main(int argc, char **argv)
+#endif
+{
+	char *start, *end;
+	char buf[32];
+	int i;
+
+	if (argc == 0)
+	{
+		fprintf(stderr, "No command name found!\n");
+		return 1;
+	}
+
+	/* Check argv[0] */
+
+	if (argc > 0)
+	{
+		end = start = argv[0];
+		while (*end)
+			end++;
+		if ((end-4 >= start) && (end[-4] == '.') && (end[-3] == 'e') && (end[-2] == 'x') && (end[-1] == 'e'))
+			end = end-4;
+		for (i = 0; i < (int)nelem(tools); i++)
+		{
+			strcpy(buf, "mupdf");
+			strcat(buf, tools[i].name);
+			if (namematch(end, start, buf) || namematch(end, start, buf+2))
+				return tools[i].func(argc, argv);
+			strcpy(buf, "mu");
+			strcat(buf, tools[i].name);
+			if (namematch(end, start, buf))
+				return tools[i].func(argc, argv);
+		}
+	}
+
+	/* Check argv[1] */
+
+	if (argc > 1)
+	{
+		for (i = 0; i < (int)nelem(tools); i++)
+			if (!strcmp(tools[i].name, argv[1]))
+				return tools[i].func(argc - 1, argv + 1);
+		if (!strcmp(argv[1], "-v"))
+		{
+			fprintf(stderr, "mutool version %s\n", FZ_VERSION);
+			return 0;
+		}
+	}
+
+	/* Print usage */
+
+	fprintf(stderr, "mutool version %s\n", FZ_VERSION);
+	fprintf(stderr, "usage: mutool <command> [options]\n");
+
+	for (i = 0; i < (int)nelem(tools); i++)
+		fprintf(stderr, "\t%s\t-- %s\n", tools[i].name, tools[i].desc);
+
+	return 1;
+}
+
+#ifdef _MSC_VER
+int wmain(int argc, wchar_t *wargv[])
+{
+	char **argv = fz_argv_from_wargv(argc, wargv);
+	int ret = main(argc, argv);
+	fz_free_argv(argc, argv);
+	return ret;
+}
+#endif