Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set metada in PDF being created with FlyingSaucer

I'm trying to set the metadata (such as Title or Author) in a PDF file that I'm creating with FlyingSaucer (https://github.com/flyingsaucerproject/flyingsaucer) from an HTML file.

Here's the code that creates the PDF file:

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    ITextRenderer renderer = new ITextRenderer();
    renderer.getFontResolver().addFont("fonts/VERDANA.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.getFontResolver().addFont("fonts/VERDANAB.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.getFontResolver().addFont("fonts/VERDANAI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.getFontResolver().addFont("fonts/VERDANAZ.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.setDocumentFromString(... HTML as a String ...);
    renderer.layout();
    renderer.createPDF(out);

    FileOutputStream fos = new FileOutputStream(pathPdf);

    PdfReader reader = new PdfReader(baos.toByteArray());
    PdfStamper stamper = new PdfStamper(reader, fos);

    ... sets watermark image if available ...

    stamper.close();
    reader.close();

I've tried getting the PdfDictionary and setting the metadata, getting the info map and setting the metadata, and getting the Document to set the metadata, but I cannot make it work.

like image 496
shulito Avatar asked Jan 22 '26 05:01

shulito


2 Answers

You can do it easier. The essence is to get the writer after the createPdf method, and you must not close the document during pdf creation, but you must do it manually at the end:

 ITextRenderer renderer = new ITextRenderer();
 renderer.setDocumentFromString(html); 
 renderer.layout();
 renderer.createPDF(outputStream, false);
 renderer.getWriter().getInfo().put(PdfName.CREATOR, new PdfString("witek"));
 renderer.finishPDF();
like image 123
witek Avatar answered Jan 24 '26 18:01

witek


Found the solution:

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    ITextRenderer renderer = new ITextRenderer();
    renderer.getFontResolver().addFont("fonts/VERDANA.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.getFontResolver().addFont("fonts/VERDANAB.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.getFontResolver().addFont("fonts/VERDANAI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.getFontResolver().addFont("fonts/VERDANAZ.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    renderer.setDocumentFromString(... HTML as a String ...);
    renderer.layout();
    renderer.createPDF(out);

    FileOutputStream fos = new FileOutputStream(pathPdf);

    PdfReader reader = new PdfReader(baos.toByteArray());
    PdfStamper stamper = new PdfStamper(reader, fos);

    ... sets watermark image if available ...

    PdfDictionary info = reader.getTrailer().getAsDict(PdfName.INFO);
    info.getKeys().forEach((k) -> {
        System.out.println("k: " + k + ", v:" + info.get((PdfName) k));
    });
    info.put(PdfName.TITLE, new PdfString("Title", PdfObject.TEXT_UNICODE));
    info.put(PdfName.AUTHOR, new PdfString("Author", PdfObject.TEXT_UNICODE));

    stamper.close();
    reader.close();
like image 43
shulito Avatar answered Jan 24 '26 19:01

shulito