2010-11-04 21 views
5

Próbuję napisać metadanych do pliku PDF za pomocą następującego kodu Pythona:Zapisywanie metadanych do pliku PDF za pomocą 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" 

wydaje się działać prawidłowo (brak błędów do pocieszony), jednak kiedy zbadać metadane pliku to następująco:

PdfID0: 
242b7e252f1d3fdd89b35751b3f72d3 
PdfID1: 
242b7e252f1d3fdd89b35751b3f72d3 
NumberOfPages: 4 

i oryginalny plik miał następujące metadane:

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 

Problem polega więc na tym, że nie dołączają one metadanych i czyści poprzednią strukturę metadanych. Co muszę zrobić, aby to zadziałało? Moim celem jest dołączenie metadanych, które mogą być przywoływane przez systemy zarządzania.

Odpowiedz

4

Znak jest na dobrej drodze, ale istnieje kilka osobliwości, które należy uwzględnić.

Po pierwsze ma rację, że pdfdoc.documentAttributes to NSDictionary zawierający metadane dokumentu. Chcesz to zmienić, ale pamiętaj, że documentAttributes daje NSDictionary, który jest niezmienny. Trzeba przekonwertować go do NSMutableDictionary następująco:

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

Teraz można zmodyfikować attrs jak ty. Nie ma potrzeby pisania PDFDocument.PDFDocumentTitleAttribute, jak zasugerował Mark, że jeden nie zadziała, PDFDocumentTitleAttribute jest zadeklarowany jako stała poziomu modułu, więc po prostu rób tak jak w swoim własnym kodzie.

Oto pełny kod, który działa dla mnie:

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

Dzięki za odpowiedź, Tamás. Tylko jedno pytanie, gdzie mogę znaleźć inne atrybuty? Próbuję kodować w sztywny sposób metadane z pliku .bib z plikami PDF i nie wiem, czy istnieją ograniczenia dotyczące tego, co mogę przechowywać. – djq

+2

Poszukaj ich w dokumentacji PDFKit na stronie głównej Apple; lista stałych, których szukasz, jest tutaj (przepraszam za długi link): http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/QuartzFramework/Classes/PDFDocument_Class/Reference/Reference.html % 23 // apple_ref/doc/uid/TP40003873. Poszukaj sekcji Constants i "Klucze Atrybutów Dokumentu" wewnątrz niej. –

+0

Byłem trochę wolny wypróbowując ten kod - ale nie mogę go uruchomić poza linią . Czy jest jakaś wersja specyficzna dla ? – djq

1

OŚWIADCZENIE: Jestem całkowicie nowy w Pythonie, ale stary układ w PDF.

Aby uniknąć zniszczenia wszystkich istniejących atrybutów, należy uruchomić attrs z pdfDoc.documentAttributes, a nie {}. setDocumentAttributes to prawie na pewno nadpisanie , zastępujące, a nie scalenie (dane wyjściowe tutaj).

Po drugie, wszystkie stałe PDFDocument*Attribute są częścią stałych części . Moja ignorancja w Pythonie niewątpliwie się pokazuje, ale czy nie powinieneś odnosić się do nich jako do atrybutów, a nie do nagich zmiennych? W ten sposób:

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

Można przypisać do PDFDocumentTitleAttribute prowadzi mnie do przekonania, że ​​nie jest stała.

Jeśli mam rację, twoje atrybuty spróbują przypisać wiele wartości do klucza zerowego. Mój Python jest słaby, więc nie wiem, jak to sprawdzić. Zbadanie attrs przed wywołaniem pdfDoc.setDocumentAttributes_() powinno być odkrywcze.

+0

Dzięki za sugestię Mark. Po prostu próbuję zrozumieć pierwszą część twojego komentarza - czy powinno to być pdfDoc.documentAttributes = {} lub pdfDoc.documentAttributes.attrs = {}? – djq

+0

attrs = pdfdoc.documentAttributes –

Powiązane problemy