2014-09-06 58 views
5

我有一個iText Document對象,我想寫入一些元數據或讀取它。
我該怎麼做?
獲取和設置itext pdf文檔的元數據

試想一下,該文件是beeing傳遞到像一個方法:

public void prePreccess(Object document) { 
    Document pdfDocument = ((Document) document); 
    //What to do here with pdfDocument? 
} 

回答

11

你想填充一個PDF的信息詞典嗎?這在MetadataPdf示例中有解釋:

// step 1 
Document document = new Document(); 
// step 2 
PdfWriter.getInstance(document, new FileOutputStream(filename)); 
// step 3 
document.addTitle("Hello World example"); 
document.addAuthor("Bruno Lowagie"); 
document.addSubject("This example shows how to add metadata"); 
document.addKeywords("Metadata, iText, PDF"); 
document.addCreator("My program using iText"); 
document.open(); 
// step 4 
document.add(new Paragraph("Hello World")); 
// step 5 
document.close(); 

是否要設置XMP元數據?這是在MetadataXmp例子解釋:

// step 1 
Document document = new Document(); 
// step 2 
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT1)); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
XmpWriter xmp = new XmpWriter(os); 
XmpSchema dc = new com.itextpdf.text.xml.xmp.DublinCoreSchema(); 
XmpArray subject = new XmpArray(XmpArray.UNORDERED); 
subject.add("Hello World"); 
subject.add("XMP & Metadata"); 
subject.add("Metadata"); 
dc.setProperty(DublinCoreSchema.SUBJECT, subject); 
xmp.addRdfDescription(dc); 
PdfSchema pdf = new PdfSchema(); 
pdf.setProperty(PdfSchema.KEYWORDS, "Hello World, XMP, Metadata"); 
pdf.setProperty(PdfSchema.VERSION, "1.4"); 
xmp.addRdfDescription(pdf); 
xmp.close(); 
writer.setXmpMetadata(os.toByteArray()); 
// step 3 
document.open(); 
// step 4 
document.add(new Paragraph("Hello World")); 
// step 5 
document.close(); 

注意,此方法已被棄用:我們最近更換了XMP功能,但我們還是要編寫使用新代碼的一些例子。

也許你想設置填充信息字典,並在同一時間創建XMP元數據:

// step 1 
Document document = new Document(); 
// step 2 
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename)); 
document.addTitle("Hello World example"); 
document.addSubject("This example shows how to add metadata & XMP"); 
document.addKeywords("Metadata, iText, step 3"); 
document.addCreator("My program using 'iText'"); 
document.addAuthor("Bruno Lowagie"); 
writer.createXmpMetadata(); 
// step 3 
document.open(); 
// step 4 
document.add(new Paragraph("Hello World")); 
// step 5 
document.close(); 

如果我是你,我想是因爲它是最完整的解決方案使用此選項。

不應從Document對象讀取元數據。

您可以從現有的PDF這樣的閱讀XMP流:

public void readXmpMetadata(String src, String dest) throws IOException { 
    PdfReader reader = new PdfReader(src); 
    FileOutputStream fos = new FileOutputStream(dest); 
    byte[] b = reader.getMetadata(); 
    fos.write(b, 0, b.length); 
    fos.flush(); 
    fos.close(); 
    reader.close(); 
} 

您可以讀取信息詞典中的詞條是這樣的:

PdfReader reader = new PdfReader(src); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
Map<String, String> info = reader.getInfo(); 

info對象將包含一系列在PDF中存儲爲元數據的鍵和值。

+0

謝謝你的詳細解答。但問題是我沒有訪問我的方法中的輸出流。無論如何要將某種屬性傳遞給文檔對象並在以後檢索它? – Soosh 2014-09-06 10:23:11

+0

順便說一下,決定我們應該使用哪個版本並不是我的... – Soosh 2014-09-06 10:45:22

+0

不,'Document'將元數據轉發給它的監聽器,並且您無權訪問這些監聽器處理的元數據。至於版本,請告訴我們如何對此決定負責。 – 2014-09-06 11:15:10