summaryrefslogtreecommitdiff
path: root/office/zathura-pdf-mupdf/patches/0006-Parse-entries-in-the-document-information-dictionary.patch
diff options
context:
space:
mode:
Diffstat (limited to 'office/zathura-pdf-mupdf/patches/0006-Parse-entries-in-the-document-information-dictionary.patch')
-rw-r--r--office/zathura-pdf-mupdf/patches/0006-Parse-entries-in-the-document-information-dictionary.patch147
1 files changed, 147 insertions, 0 deletions
diff --git a/office/zathura-pdf-mupdf/patches/0006-Parse-entries-in-the-document-information-dictionary.patch b/office/zathura-pdf-mupdf/patches/0006-Parse-entries-in-the-document-information-dictionary.patch
new file mode 100644
index 0000000000..5101a90cde
--- /dev/null
+++ b/office/zathura-pdf-mupdf/patches/0006-Parse-entries-in-the-document-information-dictionary.patch
@@ -0,0 +1,147 @@
+From 99bff723291f5aa2558e5c8b475f496025105f4a Mon Sep 17 00:00:00 2001
+From: Moritz Lipp <mlq@pwmt.org>
+Date: Mon, 20 Apr 2015 00:30:54 +0200
+Subject: [PATCH 6/6] Parse entries in the document information dictionary
+
+---
+ document.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ plugin.c | 4 +--
+ 2 files changed, 99 insertions(+), 3 deletions(-)
+
+diff --git a/document.c b/document.c
+index de805bb..873866c 100644
+--- a/document.c
++++ b/document.c
+@@ -6,8 +6,12 @@
+ #include <mupdf/xps.h>
+ #include <mupdf/pdf.h>
+
++#include <glib-2.0/glib.h>
++
+ #include "plugin.h"
+
++#define LENGTH(x) (sizeof(x)/sizeof((x)[0]))
++
+ zathura_error_t
+ pdf_document_open(zathura_document_t* document)
+ {
+@@ -118,3 +122,97 @@ pdf_document_save_as(zathura_document_t* document, mupdf_document_t*
+ return ZATHURA_ERROR_OK;
+ }
+
++girara_list_t*
++pdf_document_get_information(zathura_document_t* document, mupdf_document_t*
++ mupdf_document, zathura_error_t* error)
++{
++ if (document == NULL || mupdf_document == NULL || error == NULL) {
++ if (error != NULL) {
++ *error = ZATHURA_ERROR_INVALID_ARGUMENTS;
++ }
++ }
++
++ girara_list_t* list = zathura_document_information_entry_list_new();
++ if (list == NULL) {
++ if (error != NULL) {
++ *error = ZATHURA_ERROR_UNKNOWN;
++ }
++ return NULL;
++ }
++
++ fz_try (mupdf_document->ctx) {
++ pdf_obj* trailer = pdf_trailer(mupdf_document->ctx, (pdf_document*) mupdf_document->document);
++ pdf_obj* info_dict = pdf_dict_get(mupdf_document->ctx, trailer, PDF_NAME_Info);
++
++ /* get string values */
++ typedef struct info_value_s {
++ const char* property;
++ zathura_document_information_type_t type;
++ } info_value_t;
++
++ static const info_value_t string_values[] = {
++ { "Title", ZATHURA_DOCUMENT_INFORMATION_TITLE },
++ { "Author", ZATHURA_DOCUMENT_INFORMATION_AUTHOR },
++ { "Subject", ZATHURA_DOCUMENT_INFORMATION_SUBJECT },
++ { "Keywords", ZATHURA_DOCUMENT_INFORMATION_KEYWORDS },
++ { "Creator", ZATHURA_DOCUMENT_INFORMATION_CREATOR },
++ { "Producer", ZATHURA_DOCUMENT_INFORMATION_PRODUCER }
++ };
++
++ for (unsigned int i = 0; i < LENGTH(string_values); i++) {
++ pdf_obj* value = pdf_dict_gets(mupdf_document->ctx, info_dict, string_values[i].property);
++ if (value == NULL) {
++ continue;
++ }
++
++ char* str_value = pdf_to_str_buf(mupdf_document->ctx, value);
++ if (str_value == NULL || strlen(str_value) == 0) {
++ continue;
++ }
++
++ zathura_document_information_entry_t* entry =
++ zathura_document_information_entry_new(
++ string_values[i].type,
++ str_value
++ );
++
++ if (entry != NULL) {
++ girara_list_append(list, entry);
++ }
++ }
++
++ static const info_value_t time_values[] = {
++ { "CreationDate", ZATHURA_DOCUMENT_INFORMATION_CREATION_DATE },
++ { "ModDate", ZATHURA_DOCUMENT_INFORMATION_MODIFICATION_DATE }
++ };
++
++ for (unsigned int i = 0; i < LENGTH(time_values); i++) {
++ pdf_obj* value = pdf_dict_gets(mupdf_document->ctx, info_dict, time_values[i].property);
++ if (value == NULL) {
++ continue;
++ }
++
++ char* str_value = pdf_to_str_buf(mupdf_document->ctx, value);
++ if (str_value == NULL || strlen(str_value) == 0) {
++ continue;
++ }
++
++ zathura_document_information_entry_t* entry =
++ zathura_document_information_entry_new(
++ time_values[i].type,
++ str_value // FIXME: Convert to common format
++ );
++
++ if (entry != NULL) {
++ girara_list_append(list, entry);
++ }
++ }
++ } fz_catch (mupdf_document->ctx) {
++ if (error != NULL) {
++ *error = ZATHURA_ERROR_UNKNOWN;
++ }
++ return NULL;
++ }
++
++ return list;
++}
+diff --git a/plugin.c b/plugin.c
+index fef2c6a..2efae6f 100644
+--- a/plugin.c
++++ b/plugin.c
+@@ -11,13 +11,11 @@ register_functions(zathura_plugin_functions_t* functions)
+ functions->document_free = (zathura_plugin_document_free_t) pdf_document_free;
+ functions->document_save_as = (zathura_plugin_document_save_as_t) pdf_document_save_as;
+ functions->document_index_generate = (zathura_plugin_document_index_generate_t) pdf_document_index_generate;
++ functions->document_get_information = (zathura_plugin_document_get_information_t) pdf_document_get_information;
+ functions->page_init = (zathura_plugin_page_init_t) pdf_page_init;
+ functions->page_clear = (zathura_plugin_page_clear_t) pdf_page_clear;
+ functions->page_search_text = (zathura_plugin_page_search_text_t) pdf_page_search_text;
+ functions->page_links_get = (zathura_plugin_page_links_get_t) pdf_page_links_get;
+-#if 0
+- functions->document_get_information = (zathura_plugin_document_get_information_t) pdf_document_get_information;
+-#endif
+ functions->page_images_get = (zathura_plugin_page_images_get_t) pdf_page_images_get;
+ functions->page_get_text = (zathura_plugin_page_get_text_t) pdf_page_get_text;
+ functions->page_render = (zathura_plugin_page_render_t) pdf_page_render;
+--
+1.8.4
+