2010-11-04 34 views
5

我嘗試使用下面的Python代碼將元數據寫入到PDF文件的元數據寫入到PDF:使用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" 

這似乎很好地工作(沒有錯誤的安慰),但是當我檢查文件的元數據,其計算方法如下:

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

馬克在正確的軌道上,但有一些特點應該考慮。

首先,他是正確的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") 
+0

感謝您的回答,Tamás。只有一個問題,我在哪裏可以找到其他屬性?我試圖使用PDF來從.bib文件中對元數據進行硬編碼,但我不知道是否對我可以存儲的內容有任何限制。 – djq 2010-11-24 21:23:52

+2

只需在Apple的主頁上查看PDFKit的文檔,你正在尋找的常量列表在這裏(對於長鏈接):http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/QuartzFramework/Classes/PDFDocument_Class/Reference/Reference.html %23 // apple_ref/doc/uid/TP40003873。查找常量部分和其中的「文檔屬性鍵」。 – 2010-11-24 23:53:21

+0

我一直在嘗試這段代碼有點慢 - 但我無法讓它超出行。是否有關於的特定版本? – djq 2010-12-22 01:11:49

1

免責聲明:我對Python完全陌生,但是對於PDF來說是一個老手。

爲了避免粉碎所有現有的屬性,您需要啓動attrspdfDoc.documentAttributes,而不是{}。 setDocumentAttributes幾乎肯定是覆蓋而不是合併(在這裏給出你的輸出)。

其次,所有PDFDocument*Attribute常數是PDFDocument的一部分。我的Python無知毫無疑問是顯示出來的,但是不應該將它們作爲屬性引用而不是作爲裸露變量引用它們?像這樣:

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

你可以指定給PDFDocumentTitleAttribute,這讓我相信它不是一個常量。

如果我是對的,你的attrs會嘗試給null鍵分配多個值。我的Python很弱,所以我不知道你會如何檢查。在致電pdfDoc.setDocumentAttributes_()之前檢查attrs應該揭示。

+0

感謝您的建議,馬克。我只是想了解您的評論的第一部分 - 它應該是pdfDoc.documentAttributes = {}還是pdfDoc.documentAttributes.attrs = {}? – djq 2010-11-10 02:25:58

+0

attrs = pdfdoc.documentAttributes – 2010-11-10 03:16:44