6

我正在尝试使用以下 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

所以问题是,它不是附加元数据,而是清除以前的元数据结构。我需要做什么才能使其正常工作?我的目标是附加参考管理系统可以导入的元数据。

4

2 回答 2

6

马克走在正确的轨道上,但有一些特点需要考虑。

首先,他是正确的,它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")
于 2010-11-12T23:12:27.477 回答
2

免责声明:我对 Python 完全陌生,但我是 PDF 的老手。

为避免破坏所有现有属性,您需要以 开头attrspdfDoc.documentAttributes而不是{}. setDocumentAttributes 几乎可以肯定是覆盖而不是合并(在此处给出您的输出)。

其次,所有PDFDocument*Attribute常数都是 的一部分PDFDocument。毫无疑问,我对 Python 的无知正在表现出来,但是您不应该将它们作为属性而不是作为裸变量来引用吗?像这样:

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

您可以分配给 PDFDocumentTitleAttribute 让我相信它不是一个常数。

如果我是对的,您的 attrs 将尝试将多个值分配给空键。我的 Python 很弱,所以我不知道你会如何检查。attrs打电话前检查pdfDoc.setDocumentAttributes_()应该是有启发性的。

于 2010-11-09T22:27:40.753 回答