{
  "generatedAt": "2026-09-09T14:23:27.779Z",
  "environment": "Local HTTP application endpoints; check runner Node v24.2.0; synthetic PDF inputs",
  "method": "Actual HTTP POST requests; PDF structure read with pdf-lib and text extracted with unpdf. The PDF/A endpoint requires independent veraPDF validation before returning a file. Compression measurements come from response bytes and checked headers. Output hashes identify this run, not universal byte-for-byte reproducibility.",
  "scope": "Six synthetic examples only. No performance, all-document reliability, security, accessibility or bookmark-preservation certification. PDF/A conformance concerns only the identified sample output. Text and structural checks do not establish identical visual appearance.",
  "implementationFiles": [
    {
      "file": "apps/web/app/api/pdf/merge/route.ts",
      "sha256": "9bde1202f5ae324959b9ee90b942c6de3b30c9d912351c52bc2ea8944a5e2f0c"
    },
    {
      "file": "apps/web/app/api/pdf/split/route.ts",
      "sha256": "5f55e11e30207dff49af2523227fefefd4a0cc8564078d9868bf73a9a5b5de74"
    },
    {
      "file": "apps/web/app/api/pdf/rotate/route.ts",
      "sha256": "7860efb6229b1e6116e0ee498a0577bc727c0153a2b301a1d6b4de205f6e8a25"
    },
    {
      "file": "apps/web/app/api/pdf/compress/route.ts",
      "sha256": "f47d79ba20381d33a8a8fd97195bc6ba4ce65c6403c3202bc272e96ba783566f"
    },
    {
      "file": "apps/web/app/api/pdf/redact/route.ts",
      "sha256": "accc3bf79fc21d237a821193a65166c626d30a6432072e811372a001c9ace3f9"
    },
    {
      "file": "apps/web/app/api/pdf/pdf-to-pdfa/route.ts",
      "sha256": "3d0e99ea8b8ee32a9b3d2ab3c6e55d2f4b18db6ef78b70f936f718021e1feb2a"
    },
    {
      "file": "apps/web/scripts/redact_pdf.py",
      "sha256": "03ec894860bdb57941c6d56e6f6cd56dac69b94a0d0dd4602d4b38ea7a0c479f"
    },
    {
      "file": "apps/web/scripts/pdfa_convert.py",
      "sha256": "d27100624856ff5a5c95bbb71b0d756926ec10574e14c7dd1c4594cb60c9ee48"
    },
    {
      "file": "apps/web/lib/pdf-input.ts",
      "sha256": "a036fe0b8bb76a60644338f156f90e4903cd0d1991adcc5a8b5bb8656627855c"
    },
    {
      "file": "apps/web/lib/pdf-compression.ts",
      "sha256": "3c00d358fc66eabff3e72a171544650920278dd9cba50b216dbffe7bb153af90"
    },
    {
      "file": "scripts/quality/generate-pdf-checks.cjs",
      "sha256": "e6d6d2531c2d50bc642ca5400685e7331405fd66b1ce5df2df48ca8bb4b4ba68"
    },
    {
      "file": "package-lock.json",
      "sha256": "781653dc7d3cadc32c8eb7cbf4b7409325e371d3aede83853e58c1df184a6139"
    }
  ],
  "cases": [
    {
      "id": "merge",
      "toolId": "merge-pdf",
      "title": "Merge two PDFs in input order",
      "inputs": [
        "sample-a.pdf",
        "sample-b.pdf"
      ],
      "settings": "Sample A (3 pages), then sample B (1 page)",
      "output": "merge-output.pdf",
      "observations": [
        "4 pages in the requested order.",
        "The sample field value remains extractable as static text; no interactive fields remain."
      ],
      "labels": [
        "SAMPLE A PAGE 1",
        "SAMPLE A PAGE 2",
        "SAMPLE A PAGE 3",
        "SAMPLE B PAGE 1"
      ]
    },
    {
      "id": "split",
      "toolId": "split-pdf",
      "title": "Extract pages 3 and 1 into one PDF",
      "inputs": [
        "sample-a.pdf"
      ],
      "settings": "Page ranges: 3,1",
      "output": "split-output.pdf",
      "observations": [
        "2 pages in one output PDF, ordered as requested."
      ],
      "labels": [
        "SAMPLE A PAGE 3",
        "SAMPLE A PAGE 1"
      ]
    },
    {
      "id": "rotate",
      "toolId": "rotate-pdf",
      "title": "Rotate a three-page PDF by 90 degrees",
      "inputs": [
        "sample-a.pdf"
      ],
      "settings": "Angle: 90 degrees on all pages",
      "output": "rotate-output.pdf",
      "observations": [
        "All three page rotation values are 90 degrees.",
        "The original page dimensions and text labels remain."
      ],
      "labels": [
        "SAMPLE A PAGE 1",
        "SAMPLE A PAGE 2",
        "SAMPLE A PAGE 3"
      ]
    },
    {
      "id": "compress",
      "toolId": "compress-pdf",
      "title": "Compress a synthetic image and compare the result",
      "inputs": [
        "sample-image.pdf"
      ],
      "settings": "Recommended preset; no Desired Size target",
      "output": "compress-output.pdf",
      "observations": [
        "Input: 550,146 bytes. Output: 273,956 bytes.",
        "Reported outcome: compressed; method: adaptive.",
        "The output has one page and its heading remains extractable. Compare the pattern at high zoom: these checks do not establish identical pixels or lossless compression."
      ],
      "labels": [
        "SAMPLE IMAGE PAGE 1"
      ]
    },
    {
      "id": "redact",
      "toolId": "redact-pdf",
      "title": "Remove a fictional secret while retaining public text",
      "inputs": [
        "sample-redaction.pdf"
      ],
      "settings": "Page 1; left 8%, top 22%, width 84%, height 7%; black fill",
      "output": "redact-output.pdf",
      "observations": [
        "The fictional secret is absent from extracted output text.",
        "The public heading and the sentence below the selected region remain extractable.",
        "This checks one visible text region; it is not a guarantee that an arbitrary sensitive document has been fully sanitized."
      ],
      "labels": [
        "SAMPLE REDACTION PUBLIC"
      ]
    },
    {
      "id": "pdfa",
      "toolId": "pdf-to-pdfa",
      "title": "Convert one sample to validated PDF/A-2b",
      "inputs": [
        "sample-b.pdf"
      ],
      "settings": "PDF/A-2b conversion with the configured RGB output profile",
      "output": "pdfa-output.pdf",
      "observations": [
        "The application returned the file only after veraPDF PDF/A-2b validation passed.",
        "The output retains one page and its sample label.",
        "Conformance does not establish accessibility, legal acceptance or identical appearance."
      ],
      "labels": [
        "SAMPLE B PAGE 1"
      ]
    }
  ],
  "files": [
    {
      "name": "sample-a.pdf",
      "bytes": 2547,
      "sha256": "04c7ab483328931e598a922ec0c724e2e3c25249ccd6a15321ce44769bb0de4b"
    },
    {
      "name": "sample-b.pdf",
      "bytes": 993,
      "sha256": "fdd9f9c5c9aa0bdd39a411c47bd8378362604e691c0d7e23484078c75f532770"
    },
    {
      "name": "sample-image.pdf",
      "bytes": 550146,
      "sha256": "674ffae63a7e852304b105a576981a5ebf437a838e0a5bb3eaf0bfc849c9e641"
    },
    {
      "name": "sample-redaction.pdf",
      "bytes": 987,
      "sha256": "247fdf97fa494593e7cf77807193c11e57a067024ca0fa1fe645ea0476094ccd"
    },
    {
      "name": "merge-output.pdf",
      "bytes": 2525,
      "sha256": "ed45b301680abe3dbc3f95aed596523fe56a8cef0e408d965770814038b04e27"
    },
    {
      "name": "split-output.pdf",
      "bytes": 1822,
      "sha256": "b8d73d5913d7e4045ce522b126685a8d922db64c3f6dbe8416cb5bc5e00f1d13"
    },
    {
      "name": "rotate-output.pdf",
      "bytes": 2561,
      "sha256": "cbfd42fd963d303a5462aea4aafd9488d34301c06b3b304be373f8a23e2aae51"
    },
    {
      "name": "compress-output.pdf",
      "bytes": 273956,
      "sha256": "8b59ce5eaf57c473668bb1747e861de56a59ea676fba2bda4b5cfa2cfa48930a"
    },
    {
      "name": "redact-output.pdf",
      "bytes": 920,
      "sha256": "bb1c5d45ebe718043c527ddac8353013ef0d982a80a19f467f9349c1d560e775"
    },
    {
      "name": "pdfa-output.pdf",
      "bytes": 7927,
      "sha256": "6f06b63d7bcd53a702dac2041020219243ef0083eca16244daf765bef778e615"
    }
  ]
}
