我正在尝试使用以下python代码将元数据写入pdf文件:
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
所以问题是,它没有附加元数据,而是清除以前的元数据结构。我需要做些什么才能让它发挥作用?我的目标是附加参考管理系统可以导入的元数据。
答案 0 :(得分:4)
马克走在正确的轨道上,但应该考虑一些特点。
首先,他认为pdfdoc.documentAttributes
是包含文档元数据的NSDictionary
是正确的。您想修改它,但请注意documentAttributes
为您提供NSDictionary
,这是不可变的。您必须将其转换为NSMutableDictionary
,如下所示:
attrs = NSMutableDictionary.alloc().initWithDictionary_(pdfDoc.documentAttributes())
现在你可以像你一样修改attrs
。没有必要像Mark建议的那样编写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 :(得分:1)
免责声明:我对Python完全不熟悉,但却是PDF的老手。
为避免粉碎所有现有属性,您需要使用attrs
启动pdfDoc.documentAttributes
,而不是{}
。 setDocumentAttributes几乎肯定是覆盖而不是 merge (在这里给出你的输出)。
其次,所有PDFDocument*Attribute
常量都是PDFDocument
的一部分。毫无疑问,我的Python无知正在显示,但你不应该将它们作为属性引用而不是作为裸变量吗?像这样:
attrs[PDFDocument.PDFDocumentTitleAttribute] = "THIS IS THE TITLE"
你可以分配给PDFDocumentTitleAttribute让我相信它不是一个常数。
如果我是对的,那么你的attrs会尝试为null键分配多个值。我的Python很弱,所以我不知道你是怎么检查的。在致电attrs
之前检查pdfDoc.setDocumentAttributes_()
应该是有启发性的。