【问题标题】:How to set metada in PDF being created with FlyingSaucer如何在使用飞碟创建的 PDF 中设置元数据
【发布时间】:2017-11-10 10:15:38
【问题描述】:

我正在尝试在我使用 FlyingSaucer (https://github.com/flyingsaucerproject/flyingsaucer) 从 HTML 文件创建的 PDF 文件中设置元数据(例如标题或作者)。

这是创建 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 并设置元数据,获取信息地图并设置元数据,以及获取 Document 以设置元数据,但我无法使其工作。

【问题讨论】:

    标签: java pdf itext metadata flying-saucer


    【解决方案1】:

    找到解决方案:

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

    【讨论】:

      【解决方案2】:

      您可以更轻松地做到这一点。本质是在createPdf方法之后获取writer,在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();
      

      【讨论】:

        猜你喜欢
        • 2014-10-15
        • 2011-11-23
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多