如何使用 itext7 知道文档是否声称在 PDF/A 中

How to know if a document claims to be in PDF/A using itext7

我有一个使用 iText v5 编写的函数,我正在尝试更新它以使用 iText v7。该函数检查文档是否声称是 PDF/A(我知道 iText 不是 PDF/A 验证器,我只需要知道它是否声明为)。

v5 中的实现是 this other question 中的实现。但是,reader.getMetadata() 方法在 iText v7 中不再可用。

我发现 v7 中的 reader 提供了一种新方法,看起来非常适合这种情况 getPdfAConformanceLevel,但它总是返回 null。检查 source code 后,我没有看到 pdfAConformanceLevel 在哪里初始化,所以我想知道,这是如何工作的?

我也试过阅读 DocumentInformation,但没有成功。

我的代码是:

PdfReader reader = new PdfReader(file);
PdfAConformanceLevel level = reader.getPdfAConformanceLevel();

if (level != null) {
    String conformance = level.getConformance();
    return "A".equalsIgnoreCase(conformance) || "B".equalsIgnoreCase(conformance);
}

return false

至少有两种方法可以获得一致性级别。

第一种方式 是明确的 - 您手动完成所有工作并负责异常处理。

// Open the document
PdfDocument pdfDocument = new PdfDocument(new PdfReader(filePath));

// Parse conformance level from metadata explicitly
byte[] existingXmpMetadata = pdfDocument.getXmpMetadata();
XMPMeta meta = XMPMetaFactory.parseFromBuffer(existingXmpMetadata);
PdfAConformanceLevel conformanceLevel = PdfAConformanceLevel.getConformanceLevel(meta);

第二种方式确实是通过PdfReader。您已经正确识别了这种方式。 conformanceLevel字段是在文档打开时设置的,所以只创建PdfReader是不够的,需要打开文档:

PdfDocument pdfDocument = new PdfDocument(new PdfReader(filePath));
PdfAConformanceLevel conformanceLevel = pdfDocument.getReader().getPdfAConformanceLevel();