diff options
author | Robin Watts <robin.watts@artifex.com> | 2012-04-17 00:40:43 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2012-04-17 09:25:03 +0100 |
commit | 4069e52998d2cb2b54e65e8a8b418868ffa73bee (patch) | |
tree | 423024feca20fdb07224ecb40c807dbb3fbd4644 /pdf | |
parent | 00851c1b04215f2e5688836be57e4efdb198483b (diff) | |
download | mupdf-4069e52998d2cb2b54e65e8a8b418868ffa73bee.tar.xz |
Add Meta interface to fz_document.
Use this to reintroduce "Document Properties..." in mupdf viewer.
Diffstat (limited to 'pdf')
-rw-r--r-- | pdf/pdf_xref.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c index ffdc435e..11cf4bf0 100644 --- a/pdf/pdf_xref.c +++ b/pdf/pdf_xref.c @@ -1182,6 +1182,81 @@ static void pdf_free_page_shim(fz_document *doc, fz_page *page) pdf_free_page((pdf_document*)doc, (pdf_page*)page); } +static int pdf_meta(fz_document *doc_, int key, void *ptr, int size) +{ + pdf_document *doc = (pdf_document *)doc_; + + switch(key) + { + /* + ptr: Pointer to block (uninitialised on entry) + size: Size of block (at least 64 bytes) + Returns: Document format as a brief text string. + */ + case FZ_META_FORMAT_INFO: + sprintf((char *)ptr, "PDF %d.%d", doc->version/10, doc->version % 10); + return FZ_META_OK; + case FZ_META_CRYPT_INFO: + if (doc->crypt) + sprintf((char *)ptr, "Standard V%d %d-bit %s", + pdf_crypt_revision(doc), + pdf_crypt_length(doc), + pdf_crypt_method(doc)); + else + sprintf((char *)ptr, "None"); + return FZ_META_OK; + case FZ_META_HAS_PERMISSION: + { + int i; + switch (size) + { + case FZ_PERMISSION_PRINT: + i = PDF_PERM_PRINT; + break; + case FZ_PERMISSION_CHANGE: + i = PDF_PERM_CHANGE; + break; + case FZ_PERMISSION_COPY: + i = PDF_PERM_COPY; + break; + case FZ_PERMISSION_NOTES: + i = PDF_PERM_NOTES; + break; + default: + return 0; + } + return pdf_has_permission(doc, size); + } + case FZ_META_INFO: + { + pdf_obj *info = pdf_dict_gets(doc->trailer, "Info"); + if (!info) + { + if (ptr) + *(char *)ptr = 0; + return 0; + } + info = pdf_dict_gets(info, *(char **)ptr); + if (!info) + { + if (ptr) + *(char *)ptr = 0; + return 0; + } + if (info && ptr && size) + { + char *utf8 = pdf_to_utf8(doc->ctx, info); + strncpy(ptr, utf8, size); + ((char *)ptr)[size-1] = 0; + fz_free(doc->ctx, utf8); + } + return 1; + } + default: + return FZ_META_UNKNOWN_KEY; + } +} + static void pdf_init_document(pdf_document *doc) { @@ -1195,4 +1270,5 @@ pdf_init_document(pdf_document *doc) doc->super.bound_page = pdf_bound_page_shim; doc->super.run_page = pdf_run_page_shim; doc->super.free_page = pdf_free_page_shim; + doc->super.meta = pdf_meta; } |