2010-11-04 2 views
5

Я пытаюсь написать метаданные в файл в формате PDF, используя следующий код Python:Запись метаданных в формате PDF с использованием PyObjC

from Foundation import * 
from Quartz import * 

url = NSURL.fileURLWithPath_("test.pdf") 
pdfdoc = PDFDocument.alloc().initWithURL_(url) 
assert pdfdoc, "failed to create document" 

print "reading pdf file" 

attrs = {} 
attrs[PDFDocumentTitleAttribute] = "THIS IS THE TITLE" 
attrs[PDFDocumentAuthorAttribute] = "A. Author and B. Author" 

PDFDocumentTitleAttribute = "test" 

pdfdoc.setDocumentAttributes_(attrs) 
pdfdoc.writeToFile_("mynewfile.pdf") 

print "pdf made" 

Это появляется, чтобы работать нормально (без ошибок к утешил), однако, когда я проверять метаданные файла он выглядит следующим образом:

PdfID0: 
242b7e252f1d3fdd89b35751b3f72d3 
PdfID1: 
242b7e252f1d3fdd89b35751b3f72d3 
NumberOfPages: 4 

и исходный файл имел следующие метаданные:

InfoKey: Creator 
InfoValue: PScript5.dll Version 5.2.2 
InfoKey: Title 
InfoValue: Microsoft Word - PROGRESS ON THE GABION HOUSE Compressed.doc 
InfoKey: Producer 
InfoValue: GPL Ghostscript 8.15 
InfoKey: Author 
InfoValue: PWK 
InfoKey: ModDate 
InfoValue: D:20101021193627-05'00' 
InfoKey: CreationDate 
InfoValue: D:20101008152350Z 
PdfID0: d5fd6d3960122ba72117db6c4d46cefa 
PdfID1: 24bade63285c641b11a8248ada9f19 
NumberOfPages: 4 

Таким образом, проблемы состоят в том, что они не добавляют метаданные и очищают предыдущую структуру метаданных. Что мне нужно сделать, чтобы заставить это работать? Моя цель - добавить метаданные, которые могут импортировать системы управления ссылками.

ответ

4

Марк находится на правильном пути, но есть несколько особенностей, которые следует учитывать.

Во-первых, он прав, что pdfdoc.documentAttributes является NSDictionary, который содержит метаданные документа. Вы хотели бы изменить это, но обратите внимание, что documentAttributes дает вам NSDictionary, что является неизменным. Вы должны преобразовать его в NSMutableDictionary следующим образом:

attrs = NSMutableDictionary.alloc().initWithDictionary_(pdfDoc.documentAttributes()) 

Теперь вы можете изменить attrs, как вы делали. Нет необходимости писать PDFDocument.PDFDocumentTitleAttribute, поскольку Mark предложил, что один не будет работать, PDFDocumentTitleAttribute объявлен как константа на уровне модуля, так что сделайте так же, как и в своем собственном коде.

Вот полный код, который работает для меня:

from Foundation import * 
from Quartz import * 

url = NSURL.fileURLWithPath_("test.pdf") 
pdfdoc = PDFDocument.alloc().initWithURL_(url) 

attrs = NSMutableDictionary.alloc().initWithDictionary_(pdfdoc.documentAttributes()) 
attrs[PDFDocumentTitleAttribute] = "THIS IS THE TITLE" 
attrs[PDFDocumentAuthorAttribute] = "A. Author and B. Author" 

pdfdoc.setDocumentAttributes_(attrs) 
pdfdoc.writeToFile_("mynewfile.pdf") 
+0

Спасибо за ответ, Tamás. Только один вопрос, где я могу найти, что другие атрибуты? Я пытаюсь скомпилировать метаданные из .bib-файла с помощью PDF-файлов, и я не знаю, существуют ли какие-либо ограничения на то, что я могу хранить. – djq

+2

Просто посмотрите их в документации PDFKit на главной странице Apple; список констант, которые вы ищете, здесь (извините за длинную ссылку): http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/QuartzFramework/Classes/PDFDocument_Class/Reference/Reference.html % 23 // apple_ref/doc/uid/TP40003873. Найдите в нем раздел «Константы» и «Ключи атрибутов документа». –

+0

Я немного медленно тестировал этот код, но я не могу заставить его работать за пределами строки . Есть ли что-то конкретное в версии ? – djq

1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я совершенно не знаком с Python, но старую руку в PDF.

Чтобы избежать разгрома всех существующих атрибутов, необходимо запустить attrs с pdfDoc.documentAttributes, а не {}. setDocumentAttributes почти наверняка перезаписывает, а не merge (с учетом вашего вывода здесь).

Во-вторых, все константы PDFDocument*Attribute являются частью PDFDocument. Мое незнание Python, несомненно, показывается, но разве вы не должны ссылаться на них как на атрибуты, а не как на голые переменные? Как это:

attrs[PDFDocument.PDFDocumentTitleAttribute] = "THIS IS THE TITLE" 

Что вы можете назначить PDFDocumentTitleAttribute заставляет меня верить, что это не является постоянной.

Если я прав, ваши attrs попытаются присвоить множество значений нулевому ключу. Мой Python слаб, поэтому я не знаю, как вы это проверите. Рассмотрение attrs перед вызовом pdfDoc.setDocumentAttributes_() должно быть показательным.

+0

Спасибо за ваше предложение Марка. Я просто пытаюсь понять первую часть вашего комментария - должно ли это быть pdfDoc.documentAttributes = {} или pdfDoc.documentAttributes.attrs = {}? – djq

+0

attrs = pdfdoc.documentAttributes –

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

  • Нет связанных вопросов^_^