PDF/A Conformance Validation

The PDF/A validation API allows you to validate the conformance of a PDF file. It returns a report with the level of conformance of the PDF/A file and the errors encountered during validation.

It’s available on the POST /validate_pdfa endpoint.

Request Format

The /api/validate_pdfa endpoint is a multipart/form-data request in which you can supply the PDF in two ways:

  • Upload a file as a part of the multipart request.

  • Provide the URL of a PDF file.

To access password-protected documents, include the pspdfkit-pdf-password header with the value equal to the password of the document. The two ways to supply a PDF are described in detail below.

Uploading a File

Send a multipart/form-data POST request and the PDF file that you want to validate to the /api/validate_pdfa endpoint. The name of the attached file should be file. The request looks like this:

Request

$ curl http://localhost:5000/api/validate_pdfa \
  -X 'POST' \
  -H "Authorization: Token token=secret" \
  -F [email protected]

Providing a URL of a File

Send a multipart/form-data POST request with the URL of the file that you want to validate to the /validate_pdfa endpoint. The value of the url file part should be the remote URL of the PDF file. The request looks like this:

Request

$ curl http://localhost:5000/api/validate_pdfa \
  -X 'POST' \
  -H "Authorization: Token token=secret" \
  -F url='https://www.remote-file-url.com/example.pdf'

Response Format

The response of the validate PDF/A request is a JSON object with details of conformance and a validation report. Here are two examples:

Successful validation

{
  "IsValid": true,
  "Conformance": "PDF/A-2b",
  "ValidationLog": {
    "ValidationReport": {
      "ValidationProfile": {
        "@Conformance": "PDF/A",
        "@Part": "2",
        "@Level": "B"
      },
      "ValidationResult": {
        "@IsCompliant": "True",
        "@Statement": "PDF file is compliant with validation profile requirements."
      },
      "Details": { "FailedChecks": { "@Count": "0" } }
    }
  }
}

Failed validation

{
  "Conformance": "None",
  "IsValid": false,
  "ValidationLog": {
    "ValidationReport": {
      "Details": {
        "FailedChecks": {
          "@Count": "1",
          "Check": [
            {
              "@ID": "MissingXMPMetadata",
              "@OccurenceCount": "1",
              "Occurence": {
                "@Context": "Document",
                "@ObjReference": "None",
                "@Statement": "Document XMP metadata is missing."
              }
            },
            {
              "@ID": "MissingMarkInfoDictionary",
              "@OccurenceCount": "1",
              "Occurence": {
                "@Context": "Document",
                "@ObjReference": "None",
                "@Statement": "MarkInfo dictionary is missing."
              }
            },
            {
              "@ID": "MissingStructTreeRootDictionary",
              "@OccurenceCount": "1",
              "Occurence": {
                "@Context": "Document",
                "@ObjReference": "None",
                "@Statement": "StructTreeRoot dictionary not found."
              }
            }
          ]
        }
      },
      "ValidationProfile": {
        "@Conformance": "PDF/A",
        "@Level": "A",
        "@Part": "1"
      },
      "ValidationResult": {
        "@IsCompliant": "False",
        "@Statement": "PDF file is not compliant with validation profile requirements."
      }
    }
  }
}