summaryrefslogtreecommitdiff
path: root/apps/pdfclean.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2005-08-09 18:16:23 +0200
committerTor Andersson <tor@ghostscript.com>2005-08-09 18:16:23 +0200
commit559ada6a8fe16b5dded7acebffd0d46cd272867f (patch)
tree9c5efffdc03fc32c52911c75ac0f7be260de709b /apps/pdfclean.c
parent4a10060a92a91e7a3897cb7224d204be5e372364 (diff)
downloadmupdf-559ada6a8fe16b5dded7acebffd0d46cd272867f.tar.xz
new unified pdf tool
Diffstat (limited to 'apps/pdfclean.c')
-rw-r--r--apps/pdfclean.c184
1 files changed, 0 insertions, 184 deletions
diff --git a/apps/pdfclean.c b/apps/pdfclean.c
deleted file mode 100644
index 05bef10f..00000000
--- a/apps/pdfclean.c
+++ /dev/null
@@ -1,184 +0,0 @@
-#include <fitz.h>
-#include <mupdf.h>
-
-void usage()
-{
- fprintf(stderr,
- "usage: pdfclean [options] infile.pdf outfile.pdf\n"
- " -d -\tpassword for decryption\n"
- " -g \tgarbage collect unused objects\n"
- " -r \trebuild xref table\n"
- " -x \texpand compressed streams\n"
- " -e \tencrypt outfile\n"
- " -u -\tset user password for encryption\n"
- " -o -\tset owner password\n"
- " -p -\tset permissions (combine letters 'pmca')\n"
- " -n -\tkey length in bits: 40 <= n <= 128\n"
- );
- exit(1);
-}
-
-void preloadobjstms(pdf_xref *xref)
-{
- fz_error *error;
- fz_obj *obj;
- int i;
-
- for (i = 0; i < xref->len; i++)
- {
- if (xref->table[i].type == 'o')
- {
- error = pdf_loadobject(&obj, xref, i, 0);
- if (error) fz_abort(error);
- fz_dropobj(obj);
- }
- }
-}
-
-void expandstreams(pdf_xref *xref)
-{
- fz_error *error;
- fz_obj *stmobj;
- fz_buffer *buf;
- fz_obj *stmlen;
- int i, gen;
-
- for (i = 0; i < xref->len; i++)
- {
- if (xref->table[i].type == 'n')
- {
- gen = xref->table[i].gen;
-
- if (pdf_isstream(xref, i, gen))
- {
- error = pdf_loadobject(&stmobj, xref, i, gen);
- if (error) fz_abort(error);
-
- error = pdf_loadstream(&buf, xref, i, gen);
- if (error) fz_abort(error);
-
- fz_dictdels(stmobj, "Filter");
- fz_dictdels(stmobj, "DecodeParms");
-
- error = fz_newint(&stmlen, buf->wp - buf->rp);
- if (error) fz_abort(error);
- error = fz_dictputs(stmobj, "Length", stmlen);
- if (error) fz_abort(error);
- fz_dropobj(stmlen);
-
- pdf_updateobject(xref, i, gen, stmobj);
- pdf_updatestream(xref, i, gen, buf);
-
- fz_dropobj(stmobj);
- }
- }
- }
-}
-
-int main(int argc, char **argv)
-{
- fz_error *error;
- char *infile;
- char *outfile;
- pdf_xref *xref;
- int c;
-
- pdf_crypt *encrypt = 0;
- int doencrypt = 0;
- int dorepair = 0;
- int doexpand = 0;
- int dogc = 0;
-
- char *userpw = "";
- char *ownerpw = "";
- unsigned perms = 0xfffff0c0; /* nothing allowed */
- int keylen = 40;
- char *password = "";
-
- while ((c = getopt(argc, argv, "rgxd:eu:o:p:n:")) != -1)
- {
- switch (c)
- {
- case 'r': ++ dorepair; break;
- case 'x': ++ doexpand; break;
- case 'g': ++ dogc; break;
- case 'e': ++ doencrypt; break;
- case 'u': userpw = optarg; break;
- case 'o': ownerpw = optarg; break;
- case 'p':
- /* see TABLE 3.15 User access permissions */
- perms = 0xfffff0c0;
- if (strchr(optarg, 'p')) /* print */
- perms |= (1 << 2) | (1 << 11);
- if (strchr(optarg, 'm')) /* modify */
- perms |= (1 << 3) | (1 << 10);
- if (strchr(optarg, 'c')) /* copy */
- perms |= (1 << 4) | (1 << 9);
- if (strchr(optarg, 'a')) /* annotate / forms */
- perms |= (1 << 5) | (1 << 8);
- break;
- case 'n': keylen = atoi(optarg); break;
- case 'd': password = optarg; break;
- default: usage();
- }
- }
-
- if (argc - optind < 2)
- usage();
-
- infile = argv[optind++];
- outfile = argv[optind++];
-
- error = pdf_newxref(&xref);
-
- if (dorepair)
- error = pdf_repairxref(xref, infile);
- else
- error = pdf_loadxref(xref, infile);
- if (error)
- fz_abort(error);
-
- error = pdf_decryptxref(xref);
- if (error)
- fz_abort(error);
-
- if (xref->crypt)
- {
- error = pdf_setpassword(xref->crypt, password);
- if (error) fz_abort(error);
- }
-
- if (doencrypt)
- {
- fz_obj *id = fz_dictgets(xref->trailer, "ID");
- if (!id)
- fz_packobj(&id, "[(ABCDEFGHIJKLMNOP)(ABCDEFGHIJKLMNOP)]");
- else
- fz_keepobj(id);
- error = pdf_newencrypt(&encrypt, userpw, ownerpw, perms, keylen, id);
- if (error)
- fz_abort(error);
- fz_dropobj(id);
- }
-
- if (doexpand)
- expandstreams(xref);
-
- if (dogc)
- {
- preloadobjstms(xref);
- pdf_garbagecollect(xref);
- }
-
- error = pdf_savexref(xref, outfile, encrypt);
- if (error)
- fz_abort(error);
-
- if (encrypt)
- pdf_dropcrypt(encrypt);
-
- pdf_closexref(xref);
-
- return 0;
-}
-