Module: Pdfrb::Conformance::PdfA4Deep

Defined in:
lib/pdfrb/conformance/pdf_a4_deep.rb

Overview

PDF/A-4 deep checks (ISO 19005-4). Builds on the SHARED + A4 rules in Pdfrb::Conformance::PdfA by adding additional structural requirements specific to PDF/A-4: PDF 2.0 base, XMP metadata required (not just recommended), /AF entries valid per App Note 002.

Constant Summary collapse

RULESET =
RuleSet.new("PDF/A-4-deep").tap do |rs|
  rs.register(Rule.new(
                id: "a4deep-1",
                description: "PDF/A-4 requires XMP /Metadata stream",
                severity: :error,
                spec_clause: "ISO 19005-4 6.1",
                check: ->(doc) {
                  next nil if doc.catalog[:Metadata]

                  Violation.new(
                    rule_id: "a4deep-1",
                    message: "PDF/A-4 requires /Catalog/Metadata XMP stream",
                    object: "Catalog/Metadata",
                    severity: :error,
                    spec_clause: "ISO 19005-4 6.1"
                  )
                }
              ))

  rs.register(Rule.new(
                id: "a4deep-2",
                description: "PDF/A-4 should have valid /OutputIntents when colour-managed",
                severity: :warning,
                spec_clause: "ISO 19005-4 6.2.4",
                check: ->(doc) {
                  next nil if doc.catalog[:OutputIntents]

                  # Only flag when document has ICCBased color spaces
                  has_icc = false
                  doc.each_indirect_object do |obj|
                    next unless obj.value[:ColorSpace]

                    cs = obj.value[:ColorSpace]
                    cs_array = cs.is_a?(::Array) ? cs : [cs]
                    if cs_array.any?(:ICCBased)
                      has_icc = true
                      break
                    end
                  end
                  next nil unless has_icc

                  Violation.new(
                    rule_id: "a4deep-2",
                    message: "ICC-based color spaces require /OutputIntents in PDF/A-4",
                    object: "Catalog/OutputIntents",
                    severity: :warning,
                    spec_clause: "ISO 19005-4 6.2.4"
                  )
                }
              ))

  rs.register(Rule.new(
                id: "a4deep-3",
                description: "PDF/A-4 forbids EmbeddedFile streams",
                severity: :error,
                spec_clause: "ISO 19005-4 6.4",
                check: ->(doc) {
                  vs = []
                  doc.each_indirect_object do |obj|
                    next unless obj.value[:Type] == :EmbeddedFile

                    vs << Violation.new(
                      rule_id: "a4deep-3",
                      message: "PDF/A-4 forbids EmbeddedFile streams",
                      object: "EmbeddedFile",
                      severity: :error,
                      spec_clause: "ISO 19005-4 6.4"
                    )
                  end
                  vs.empty? ? nil : vs
                }
              ))
end

Class Method Summary collapse

Class Method Details

.validate(document) ⇒ Object



88
89
90
# File 'lib/pdfrb/conformance/pdf_a4_deep.rb', line 88

def validate(document)
  RULESET.validate(document)
end