Запись метаданных в pdf с использованием pyobjc - PullRequest
5 голосов
/ 04 ноября 2010

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

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

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

Ответы [ 2 ]

4 голосов
/ 13 ноября 2010

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

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

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

Теперь вы можете изменить attrs, как вы сделали.Нет необходимости писать PDFDocument.PDFDocumentTitleAttribute, как предположил Марк, что он не будет работать, 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")
1 голос
/ 10 ноября 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...