2015-02-10 61 views

回答

1

在PDF上下文中最常見的XMP用法是當您爲從文檔引用的整個文檔添加XMP流時PDF的根詞典(又名目錄)。

但是,如果你諮詢PDF規範,您注意到XMP可以在許多其他對象的PDF裏面的環境中使用,頁面級是其中之一。如果你看看這個規範,你會發現/Metadata是頁面字典中的一個可選鍵。它期望對XMP流的引用。

如果要使用iText從頭開始創建PDF文檔,則不會找到添加此元數據的特定方法,但可以使用PdfWriter中提供的通用addPageDictEntry()。您將通過PdfName.METADATA作爲關鍵字並引用已添加到PdfWriter作爲值的流。

你的問題是不是從頭開始創建PDF,但有關修改現有的PDF。在這種情況下,你還需要頁面字典。這是很容易獲得這些詞典:

PdfReader reader = new PdfReader(src); 
int n = reader.getNumberOfPages(); 
PdfDictionary page; 
for (int p = 1; p <= n; p++) { 
    page = reader.getPageN(p); 
    // do stuff with the page dictionary 
} 

這個片段拍攝來回Rotate90Degrees例子。在這個例子中,我們來看看/Rotate進入這是一個數字:

PdfNumber rotate = page.getAsNumber(PdfName.ROTATE); 

你需要尋找的/Metadata進入,這是一個流:

PRStream stream = (PRStream) page.getAsStream(PdfName.METADATA); 

也許這流null,在這種情況下,你需要添加一個/Metadata條目顯示在AddXmpToPage例如:

// We create some XMP bytes 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
XmpWriter xmp = new XmpWriter(baos, new PdfDictionary()); 
xmp.close(); 
// We add the XMP bytes to the writer 
PdfIndirectObject ref = stamper.getWriter().addToBody(new PdfStream(baos.toByteArray())); 
// We add a reference to the XMP bytes to the page dictionary 
page.put(PdfName.METADATA, ref.getIndirectReference()); 

如果存在XMP流,則需要保留它並向其中添加一些內容。

這是你如何獲得XMP字節:

byte[] xmpBytes = PdfReader.getStreamBytes(stream); 

您對這些字節執行你的XML魔術,產生的一個新的名爲byte[] newXmpBytes。你有這樣的這些新字節替換原始字節:

stream.setData(newXmpBytes); 

所有這些操作都在駐留在PdfReader對象現有的文件來完成。現在,您可以堅持這樣的變化:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
stamper.close(); 
reader.close(); 
+0

太感謝你了(總偷懶的問題,我知道),但我怎麼添加元數據條目。不能保證每個頁面實際上都具有元數據條目。再次感謝 – Rahul 2015-02-10 09:01:54

+0

我正在更新我的問題。 – 2015-02-10 11:05:51

相關問題