Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get and set metadata for itext pdf document

I have an iText Document object and I want to write some metadata into it or read from it.
How can I do that?

Imagine that the document is beeing passed to a method like :

public void prePreccess(Object document) {
    Document pdfDocument =   ((Document) document);
    //What to do here with pdfDocument?
}
like image 291
Soosh Avatar asked Sep 06 '14 08:09

Soosh


1 Answers

Do you want to populate the info dictionary of a PDF? That's explained in the MetadataPdf example:

// 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();

Do you want to set the XMP metadata? This is explained in the MetadataXmp example:

// 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();

Note that this method is deprecated: we have replaced the XMP functionality recently, but we still have to write some examples using the new code.

Maybe you want to set populate the info dictionary and create the XMP metadata at the same time:

// 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();

If I were you, I'd use this option because it's the most complete solution.

You should not read the metadata from a Document object.

You can read the XMP stream from an existing PDF like this:

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();
}

You can read the entries in the info dictionary like this:

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

The info object will contain a series of keys and values that are stored as metadata inside the PDF.

like image 70
Bruno Lowagie Avatar answered Oct 31 '22 22:10

Bruno Lowagie