From 4e338fa918babb5e49e2323d057f70d94fb44cd2 Mon Sep 17 00:00:00 2001
From: Sebastian Rasmussen <sebras@hotmail.com>
Date: Tue, 30 Jun 2009 03:27:50 +0200
Subject: Add support to print information about encrypted pdfs.

---
 apps/pdfinfo.c | 40 +++++++++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 7 deletions(-)

(limited to 'apps')

diff --git a/apps/pdfinfo.c b/apps/pdfinfo.c
index 215d5ddf..4d3ed2bc 100644
--- a/apps/pdfinfo.c
+++ b/apps/pdfinfo.c
@@ -129,6 +129,9 @@ struct info
 		struct {
 			fz_obj *obj;
 		} info;
+		struct {
+			fz_obj *obj;
+		} crypt;
 		struct {
 			fz_rect *bbox;
 		} dim;
@@ -160,6 +163,7 @@ struct info
 };
 
 struct info *info = nil;
+struct info *cryptinfo = nil;
 struct info **dim = nil;
 int dims = 0;
 struct info **font = nil;
@@ -201,17 +205,33 @@ gatherglobalinfo()
 
 	info->page = -1;
 	info->pageref = nil;
-	info->ref = fz_dictgets(src->trailer, "Info");
-
+	info->ref = nil;
 	info->u.info.obj = nil;
 
-	if (!info->ref)
-		return;
+	if (src->info)
+	{
+		info->ref = fz_dictgets(src->trailer, "Info");
+		if (!fz_isdict(info->ref) && !fz_isindirect(info->ref))
+			die(fz_throw("not an indirect info object"));
+
+		info->u.info.obj = src->info;
+	}
+
+	cryptinfo = fz_malloc(sizeof (struct info));
 
-	if (!fz_isdict(info->ref) && !fz_isindirect(info->ref))
-		die(fz_throw("not an indirect info object"));
+	cryptinfo->page = -1;
+	cryptinfo->pageref = nil;
+	cryptinfo->ref = nil;
+	cryptinfo->u.crypt.obj = nil;
 
-	info->u.info.obj = src->info;
+	if (src->crypt)
+	{
+		cryptinfo->ref = fz_dictgets(src->trailer, "Encrypt");
+		if (!fz_isdict(cryptinfo->ref) && !fz_isindirect(cryptinfo->ref))
+			die(fz_throw("not an indirect crypt object"));
+
+		cryptinfo->u.crypt.obj = src->crypt->encrypt;
+	}
 }
 
 fz_error
@@ -777,6 +797,12 @@ printglobalinfo(char *filename)
 		fz_debugobj(info->u.info.obj);
 	}
 
+	if (cryptinfo->u.crypt.obj)
+	{
+		printf("\nEncryption object (%d %d R):\n", fz_tonum(cryptinfo->ref), fz_togen(cryptinfo->ref));
+		fz_debugobj(cryptinfo->u.crypt.obj);
+	}
+
 	printf("\nPages: %d\n\n", pdf_getpagecount(srcpages));
 }
 
-- 
cgit v1.2.3