2010-11-04 46 views
5

Tôi đang cố gắng để viết metadata vào một tập tin pdf sử dụng mã python sau:Viết siêu dữ liệu để một pdf sử dụng 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" 

Điều này dường như làm việc tốt (không có lỗi đến an ủi), tuy nhiên khi tôi kiểm tra các siêu dữ liệu của tập tin nó là như sau:

PdfID0: 
242b7e252f1d3fdd89b35751b3f72d3 
PdfID1: 
242b7e252f1d3fdd89b35751b3f72d3 
NumberOfPages: 4 

và các tập tin ban đầu đã có siêu dữ liệu sau:

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 

Vì vậy, vấn đề là, nó không phụ thêm siêu dữ liệu, và nó đang xóa cấu trúc siêu dữ liệu trước đó. Tôi cần làm gì để làm việc này? Mục tiêu của tôi là thêm siêu dữ liệu tham chiếu đến các hệ thống quản lý có thể nhập.

Trả lời

4

Đánh dấu đang đi đúng hướng, nhưng có một vài đặc điểm cần được tính toán.

Trước tiên, anh ta đúng là pdfdoc.documentAttributes là một NSDictionary chứa siêu dữ liệu tài liệu. Bạn muốn sửa đổi điều đó, nhưng lưu ý rằng documentAttributes cung cấp cho bạn NSDictionary, điều này là không thay đổi. Bạn cần phải chuyển nó sang một NSMutableDictionary như sau:

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

Bây giờ bạn có thể sửa đổi attrs như bạn đã làm. Không cần phải viết PDFDocument.PDFDocumentTitleAttribute như Mark được đề xuất, điều đó sẽ không hoạt động, PDFDocumentTitleAttribute được khai báo dưới dạng hằng số cấp mô-đun, do đó, chỉ cần thực hiện như bạn đã làm trong mã của riêng bạn.

Đây là mã đầy đủ mà làm việc cho tôi:

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

Cảm ơn câu trả lời, Tamás. Chỉ một câu hỏi, tôi có thể tìm thấy các thuộc tính khác ở đâu? Tôi đang cố gắng mã hóa siêu dữ liệu từ tệp .bib với các tệp PDF và tôi không biết liệu có bất kỳ giới hạn nào về những gì tôi có thể lưu trữ hay không. – djq

+2

Chỉ cần tra cứu chúng trong tài liệu của PDFKit trên trang chủ của Apple; danh sách các hằng số bạn đang tìm kiếm ở đây (xin lỗi vì liên kết dài): http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/QuartzFramework/Classes/PDFDocument_Class/Reference/Reference.html % 23 // apple_ref/doc/uid/TP40003873. Tìm phần Constants và "Document Attribute Keys" bên trong nó. –

+0

Tôi đã hơi chậm khi thử mã này - nhưng tôi không thể chạy nó vượt quá dòng . Có phiên bản nào cụ thể về không? – djq

1

TUYÊN BỐ TỪ CHỐI: Tôi hoàn toàn mới đối với Python, nhưng cũ là PDF.

Để tránh đập vỡ tất cả các thuộc tính hiện tại, bạn cần phải bắt đầu attrs với pdfDoc.documentAttributes, không phải {}. setDocumentAttributes gần như chắc chắn là một số ghi đè thay vì một số hợp nhất (cho đầu ra của bạn ở đây).

Thứ hai, tất cả các hằng số PDFDocument*Attribute là một phần của PDFDocument. Sự thiếu hiểu biết của Python của tôi chắc chắn là hiển thị, nhưng bạn không nên tham chiếu chúng như là các thuộc tính chứ không phải là các biến trống? Như thế này:

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

Bạn có thể gán cho PDFDocumentTitleTính năng dẫn tôi tin rằng đó không phải là hằng số.

Nếu tôi đúng, người quản lý của bạn sẽ cố gắng chỉ định nhiều giá trị cho một khóa null. Python của tôi yếu, vì vậy tôi không biết làm thế nào bạn sẽ kiểm tra điều đó. Kiểm tra attrs trước khi gọi pdfDoc.setDocumentAttributes_() cần được tiết lộ.

+0

Cảm ơn đề nghị của bạn Mark. Tôi chỉ đang cố hiểu phần đầu tiên của nhận xét của bạn - có phải là pdfDoc.documentAttributes = {} hoặc pdfDoc.documentAttributes.attrs = {} không? – djq

+0

attrs = pdfdoc.documentAttributes –

Các vấn đề liên quan