summaryrefslogtreecommitdiff
path: root/apps/pdfclean.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2011-11-25 19:42:34 +0000
committerRobin Watts <robin.watts@artifex.com>2011-11-25 19:42:34 +0000
commitbdf5c8848a2de071c8380fab86a1a49215ed5ee7 (patch)
tree8ff2e40bca4f337e5db112284992e6be67cea820 /apps/pdfclean.c
parent5f6c8d94faecc0bd87113a138befe554ab2172b2 (diff)
parent6e14149d3e915f559f99276a525862e28d6f0478 (diff)
downloadmupdf-bdf5c8848a2de071c8380fab86a1a49215ed5ee7.tar.xz
Merge branch 'master' into context
Diffstat (limited to 'apps/pdfclean.c')
-rw-r--r--apps/pdfclean.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/apps/pdfclean.c b/apps/pdfclean.c
index c77139ff..2c492951 100644
--- a/apps/pdfclean.c
+++ b/apps/pdfclean.c
@@ -287,7 +287,7 @@ static void renumberobjs(void)
static void retainpages(int argc, char **argv)
{
- fz_obj *oldroot, *root, *pages, *kids, *countobj, *parent;
+ fz_obj *oldroot, *root, *pages, *kids, *countobj, *parent, *olddests;
/* Load the old page tree */
fz_try(xref->ctx)
@@ -299,9 +299,11 @@ static void retainpages(int argc, char **argv)
die(fz_error_note(1, "cannot load page tree"));
}
- /* Keep only pages/type entry to avoid references to unretained pages */
+ /* Keep only pages/type and (reduced) dest entries to avoid
+ * references to unretained pages */
oldroot = fz_dict_gets(xref->trailer, "Root");
pages = fz_dict_gets(oldroot, "Pages");
+ olddests = pdf_load_name_tree(xref, "Dests");
root = fz_new_dict(ctx, 2);
fz_dict_puts(root, "Type", fz_dict_gets(oldroot, "Type"));
@@ -373,6 +375,41 @@ static void retainpages(int argc, char **argv)
fz_drop_obj(countobj);
fz_dict_puts(pages, "Kids", kids);
fz_drop_obj(kids);
+
+ /* Also preserve the (partial) Dests name tree */
+ if (olddests)
+ {
+ int i;
+ fz_obj *names = fz_new_dict(ctx, 1);
+ fz_obj *dests = fz_new_dict(ctx, 1);
+ fz_obj *names_list = fz_new_array(ctx, 32);
+
+ for (i = 0; i < fz_dict_len(olddests); i++)
+ {
+ fz_obj *key = fz_dict_get_key(olddests, i);
+ fz_obj *val = fz_dict_get_val(olddests, i);
+ fz_obj *key_str = fz_new_string(ctx, fz_to_name(key), strlen(fz_to_name(key)));
+ fz_obj *dest = fz_dict_gets(val, "D");
+
+ dest = fz_array_get(dest ? dest : val, 0);
+ if (fz_array_contains(fz_dict_gets(pages, "Kids"), dest))
+ {
+ fz_array_push(names_list, key_str);
+ fz_array_push(names_list, val);
+ }
+ fz_drop_obj(key_str);
+ }
+
+ root = fz_dict_gets(xref->trailer, "Root");
+ fz_dict_puts(dests, "Names", names_list);
+ fz_dict_puts(names, "Dests", dests);
+ fz_dict_puts(root, "Names", names);
+
+ fz_drop_obj(names);
+ fz_drop_obj(dests);
+ fz_drop_obj(names_list);
+ fz_drop_obj(olddests);
+ }
}
/*
@@ -792,7 +829,10 @@ int main(int argc, char **argv)
compactxref();
/* Make renumbering affect all indirect references and update xref */
- if (dogarbage >= 2)
+ /* Do not renumber objects if encryption is in use, as the object
+ * numbers are baked into the streams/strings, and we can't currently
+ * cope with moving them. See bug 692627. */
+ if (dogarbage >= 2 && xref->crypt == NULL)
renumberobjs();
writepdf();