2010-11-04 21 views
5

Estoy intentando escribir metadatos en un archivo PDF utilizando el siguiente código Python:Escribir metadatos en un archivo PDF utilizando 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" 

Esto parece funcionar bien (no hay errores en el consuelo), sin embargo cuando examinar los metadatos del archivo es la siguiente:

PdfID0: 
242b7e252f1d3fdd89b35751b3f72d3 
PdfID1: 
242b7e252f1d3fdd89b35751b3f72d3 
NumberOfPages: 4 

y el archivo original tenía los siguientes metadatos:

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 

Entonces, los problemas son que no anexa los metadatos y está borrando la estructura de metadatos anterior. ¿Qué debo hacer para que esto funcione? Mi objetivo es agregar metadatos que los sistemas de administración de referencia puedan importar.

Respuesta

4

Mark está en el camino correcto, pero hay algunas peculiaridades que deben tenerse en cuenta.

En primer lugar, tiene razón en que pdfdoc.documentAttributes es un NSDictionary que contiene los metadatos del documento. Desea modificar eso, pero tenga en cuenta que documentAttributes le da un NSDictionary, que es inmutable. Usted tiene que convertirlo en un NSMutableDictionary de la siguiente manera:

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

Ahora se puede modificar attrs como lo hizo. No es necesario escribir PDFDocument.PDFDocumentTitleAttribute como Mark sugirió, que uno no funcionará, PDFDocumentTitleAttribute se declara como una constante a nivel de módulo, así que haga lo que hizo en su propio código.

Aquí está el código completo que funciona para mí:

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

Gracias por la respuesta, Tamás. Solo una pregunta, ¿dónde puedo encontrar cuáles son los otros atributos? Estoy tratando de codificar los metadatos de un archivo .bib con los PDF y no sé si hay límites en lo que puedo almacenar. – djq

+2

Solo búsquelos en la documentación de PDFKit en la página principal de Apple; la lista de constantes que está buscando está aquí (lo siento por el enlace largo): http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/QuartzFramework/Classes/PDFDocument_Class/Reference/Reference.html % 23 // apple_ref/doc/uid/TP40003873. Busque la sección Constantes y las "Teclas de atributos del documento" dentro de ella. –

+0

He estado un poco lento probando este código, pero no puedo hacer que funcione más allá de la línea . ¿Hay alguna versión específica sobre ? – djq

1

DESCARGO DE RESPONSABILIDAD: Soy completamente nuevo en Python, pero soy viejo en PDF.

Para evitar romper todos los atributos existentes, debe iniciar attrs con pdfDoc.documentAttributes, no {}. Es casi seguro que setDocumentAttributes sobrescriba en lugar de merge (dado su resultado aquí).

En segundo lugar, todas las constantes PDFDocument*Attribute son parte de PDFDocument. La ignorancia de mi Python, sin duda, se muestra, pero ¿no debería estar haciendo referencia a ellos como atributos en lugar de como variables desnudas? De esta manera:

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

que se pueden asignar a PDFDocumentTitleAttribute me lleva a creer que no es una constante.

Si estoy en lo cierto, sus atributos habrán intentado asignar numerosos valores a una clave nula. My Python es débil, así que no sé cómo lo comprobarás. Examinar attrs antes de llamar al pdfDoc.setDocumentAttributes_() debería ser revelador.

+0

Gracias por su sugerencia Marcos. Solo trato de entender la primera parte de tu comentario, ¿debería ser pdfDoc.documentAttributes = {} o pdfDoc.documentAttributes.attrs = {}? – djq

+0

attrs = pdfdoc.documentAttributes –

Cuestiones relacionadas