{
  "method": {
    "corpus": "GovDocs1, the same 4,840 extracted PDFs as the metadata, redaction and split studies",
    "sampleRule": "of the files with 3 to 40 pages and at most 3 MB, the 400 with the lowest SHA-256 of their thread/name",
    "stamp": "text 'ZZWM DRAFT' (so it can be found when read back) or the repository's sample.png, on every page, at the tool's defaults: 48 pt, #808080, 30% opacity, 45 degrees, single (centred) or tiled at 150 pt spacing; image 40% of the page width",
    "herepdf": "HerePDF's own code (lib/pdfWatermark.js addTextWatermark and addImageWatermark)",
    "removal": "the least effort: take the last entry off every page's /Contents array and save. It is the stamp's own stream, appended after the page's content",
    "removalRestoresContent": "after that, the page's /Contents is the original streams (byte for byte, by hash) between the q and Q that wrap them",
    "textRestored": "after that, PDF.js reads the same text on the page as in the original, with no stamp text",
    "pageTextIntact": "with the watermark in, PDF.js still reads all of the page's own text (stamp pieces are filtered the same way from the original and the watermarked page, whitespace ignored)",
    "cropLoss": "for the text stamps: the least share of the page lost by trimming one side until every stamp is outside it, from the stamp boxes PDF.js reports",
    "sampleIdsSha256": "e770788a9755b782c04cf37f339ab063515cdcbe05aa851d6f4b65979588d54c",
    "tool": {
      "pdfLib": "2.11.1",
      "pdfjs": "6.3.289"
    },
    "generatedOn": "2026-10-18",
    "commit": "3eebe05"
  },
  "tried": 400,
  "completed": 388,
  "notCompleted": {
    "failed": 12
  },
  "encrypted": 10,
  "damagedPage": 2,
  "pages": 5409,
  "textSingle": {
    "pages": 5409,
    "shapeAsExpected": 5409,
    "removalRestoresContent": 5409,
    "filesWhereRemovalFailedOnAPage": 0,
    "stampTextExtractable": 5409,
    "pageTextIntact": 5409,
    "removedAndTextRestored": 5409,
    "cropLoss": {
      "pagesMeasured": 5409,
      "median": 0.66,
      "under25": 0,
      "under50": 0
    }
  },
  "textTiled": {
    "pages": 5409,
    "shapeAsExpected": 5409,
    "removalRestoresContent": 5409,
    "filesWhereRemovalFailedOnAPage": 0,
    "stampTextExtractable": 5409,
    "pageTextIntact": 5409,
    "removedAndTextRestored": 5409,
    "cropLoss": {
      "pagesMeasured": 5409,
      "median": 1,
      "under25": 0,
      "under50": 0
    }
  },
  "image": {
    "pages": 5409,
    "shapeAsExpected": 5409,
    "removalRestoresContent": 5409,
    "filesWhereRemovalFailedOnAPage": 0
  }
}
