2014-11-17 4 views
1

Как получить метаданные pdf-документа (например, название, автора, дату создания и т. Д.) С помощью библиотеки mupdf? Недостаточно документации, чтобы узнать эту функциональность. Недостаточно комментариев. Скорее всего, для этой цели есть функциональность, но в этих обстоятельствах ее трудно найти. Следующий код - это то, что у меня есть до сих пор.Как получить автор pdf-документа с mupdf

char info[64]; 
globals *glo = get_globals(env, thiz); 

fz_meta(glo->doc, FZ_META_INFO, info, sizeof(info)); 

Я использовал FZ_META_INFO тег, но он не работает. Я не получил никакой информации, просто пустой. Я проверил, что у него есть метаданные. Любая помощь приветствуется.

EDIT:

Target Android SDK: 20

Min Android SDK: 15

версия Mupdf: 1,6

NDK: R10C

OS Разработка: Ubuntu 12,04

ответ

2

В каком смысле «не работает»? Выдает сообщение об ошибке? Сражения? Вы уверены, что файл PDF, который вы используете, содержит метаданные «Инфо»?

Что такое версия MuPDF? Какую платформу вы используете?

Вам необходимо установить соответствующий ключ в буфер, который вы передаете fz_meta до, вы вызываете fz_mets, я замечаю, что вы этого не делаете.

См win_main.c около линии 487, после того, как вы пройти макрос это решает для

char info[256] 

sprintf(info, "Title"); 
fz_meta(doc, FZ_META_INFO, info, 256); 

По возвращении «информация» будет содержать метаданные, связанные с клавишей Title в словаре.

Когда сомневаешься, построить пример приложения и следовать в отладчике ......

+0

Из вашего ответа, я понимаю, 'sprintf (info,« Title »);' устанавливает ключ в буфере. , но ничего не изменилось.Несколько пустая строка возвращается.Я посмотрел на win_main.c, но я не нашел никаких связанных строк для моего случая.Я поеду за затмение для более глубокой отладки цели, даже если я использую студию Android, но далее – Shnkc

+0

Буфер, который вы отправляете в fz_meta при использовании перечисления FZ_META_INFO, должен быть инициализирован ключом, связанным с данными, которые вы хотите получить из словаря Info во входном PDF-файле. Я полагаю, вы знаете ли вы, что словарь Info может содержать определенные ключи, которые используются для извлечения определенных метаданных? Возможно, если вы поделились файлом PDF, который вы тестируете, я мог бы Более конкретно. Я не понимаю, почему вы не можете найти соответствующий код в win_main.c, есть макрос, называемый SETUTF8, который извлекает информацию с помощью fz_meta. – KenS

+0

+1 за этот отличный ответ. Но здесь есть проблема. В файле 'pdf-xref.c', в функции' pdf_meta', в случае 'FZ_META_INFO',' info = pdf_dict_gets (info, * (char **) ptr); 'приводит к фатальной проблеме при передаче массива' info' , в функцию 'fz_meta'' (фатальный сигнал 11 (SIGSEGV), код 1, ошибка addr 0x6c746954 in tid 29833) '. Я изменил строку с 'info = pdf_dict_gets (info, (char *) ptr);' и он работает. Если это ошибка, необходимо заполнить отчет об ошибке. – Shnkc

0

Если надлежащее литье позволяют передать ключ, это отливка не правильно получить обратно символ * ,

Пример; Правильного литья, чтобы послать запрос

char buff[2048]; 
strcpy(buff,"CreationDate") 
if (fz_meta(ctx,doc,FZ_META_INFO,&buff,2048)) { 
    buff[0] = 0; 
} 

Будет: найти ключ, конвертировать utf8 тогда сбой при Copyback результата

Правильной отливки получить запрос

char buff[2048]; 
strcpy(buff,"CreationDate") 
if (fz_meta(ctx,doc,FZ_META_INFO,buff,2048)) { 
    buff[0] = 0; 
} 

Сбой при сканировании dict. выглядит действительно как ошибка! Я подтверждаю, что изменение оригинал

info = pdf_dict_gets(ctx, info, (char *)ptr); 

это путь.(даже если странно, что никто не находит его при написании кода, потому что Meta - полезные функции, часто используемые

Смежные вопросы