Как установить метада в PDF, создаваемом с помощью FlyingSaucer

Я пытаюсь установить метаданные (такие как название или автор) в файле PDF, который я создаю с помощью FlyingSaucer (https://github.com/flyingsaucerproject/flyingsaucer) из файла HTML.

Вот код, который создает файл PDF:

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

Я пытался получить PdfDictionary и установить метаданные, получить информационную карту и установить метаданные, а также заставить документ установить метаданные, но я не могу заставить его работать.


person shulito    schedule 08.06.2017    source источник


Ответы (2)


Вы можете сделать это проще. Суть в том, чтобы получить писатель после метода createPdf, причем закрывать документ во время создания pdf надо не надо, а надо сделать это вручную в конце:

 ITextRenderer renderer = new ITextRenderer();
 renderer.setDocumentFromString(html); 
 renderer.layout();
 renderer.createPDF(outputStream, false);
 renderer.getWriter().getInfo().put(PdfName.CREATOR, new PdfString("witek"));
 renderer.finishPDF();
person witek    schedule 05.05.2020

Нашел решение:

    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();
person shulito    schedule 08.06.2017