如何在使用 Flying Saucer 创建的 PDF 中设置元数据
How to set metada in PDF being created with FlyingSaucer
我正在尝试在我使用 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 并设置元数据、获取信息映射并设置元数据以及获取文档以设置元数据,但我无法正常工作。
找到解决方案:
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();
你可以做得更容易。本质是在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();
我正在尝试在我使用 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 并设置元数据、获取信息映射并设置元数据以及获取文档以设置元数据,但我无法正常工作。
找到解决方案:
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();
你可以做得更容易。本质是在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();