pdf - 获取并设置itext pdf文档的元数据

标签 pdf metadata itext

我有一个iText的Document对象,我想将一些元数据写入其中或从中读取。
我怎样才能做到这一点?

想象一下,文档正在被传递给类似这样的方法:

public void prePreccess(Object document) {
    Document pdfDocument =   ((Document) document);
    //What to do here with pdfDocument?
}

最佳答案

您要填充PDF的信息字典吗?在MetadataPdf示例中对此进行了解释:

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

您是否要设置XMP元数据?在MetadataXmp示例中对此进行了解释:
// 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();

请注意,该方法已被弃用:我们最近已替换了XMP功能,但仍然必须使用新代码编写一些示例。

也许您想设置填充信息字典并同时创建XMP元数据:
// 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();

如果您是我,我会使用此选项,因为它是最完整的解决方案。

您不应从Document对象读取元数据。

您可以像这样从现有的PDF中读取XMP流:
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();
}

您可以像这样阅读信息字典中的条目:
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
Map<String, String> info = reader.getInfo();
info对象将包含一系列键和值,这些键和值作为元数据存储在PDF内部。

关于pdf - 获取并设置itext pdf文档的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698460/

相关文章:

Python Reportlab 单位cm和inch的翻译方式不同

pdf - Grails/RenderPdf阿拉伯字符

java - 用xml编写的文件描述符

c# - 当内容较长时,itextsharp 不会创建新页面

java - 在 Itext 中,如何翻转单元格的内容?

python - Tabula Py 未检测 PDF 中的表格

java - 使用pdfbox在java中将pdf文件转换为图像时缺少文本

github - github repo 是否有一种编程方式来报告支持哪些分支/发布?

php - zf2 + doctrine2 和没有要处理的元数据类

c# - 如何获取合并单元格的值?