{
  "slug": "clean-text-copied-from-pdf",
  "generatedAt": "2026-08-27T21:08:43.070Z",
  "coreSource": "assets/js/tools-src/core.js",
  "fixtureCount": 12,
  "results": [
    {
      "id": "pdf-hard-wrap-01",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "This paragraph was wrapped\nat arbitrary column widths so\ncopied text breaks mid sentence.",
      "output": "This paragraph was wrapped\nat arbitrary column widths so\ncopied text breaks mid sentence.",
      "steps": [
        {
          "op": "identity"
        }
      ],
      "lineCount": 3,
      "charCount": 89
    },
    {
      "id": "pdf-soft-hyphen-02",
      "kind": "observation",
      "generated": false,
      "status": "manual-review",
      "summary": "Input contains U+00AD soft hyphens between “exam” and “ple”. Automatic de-hyphenation can destroy real compounds.",
      "notes": "Studio has no dedicated soft-hyphen joiner; treat as manual review."
    },
    {
      "id": "pdf-header-repeat-03",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "Quarterly Report\nBody line one.\nQuarterly Report\nBody line two.",
      "output": "Quarterly Report\nBody line one.\nBody line two.",
      "steps": [
        {
          "op": "trimText"
        },
        {
          "op": "removeDuplicateLines"
        }
      ],
      "lineCount": 3,
      "charCount": 46
    },
    {
      "id": "pdf-page-numbers-04",
      "kind": "observation",
      "generated": false,
      "status": "manual-review",
      "summary": "Lines that are only digits (12, 13) look like page numbers but could be data. No safe auto-delete without context.",
      "notes": ""
    },
    {
      "id": "pdf-excess-spaces-05",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "Word1\t\tWord2    Word3 Word4",
      "output": "Word1 Word2 Word3 Word4",
      "steps": [
        {
          "op": "removeExtraSpaces"
        }
      ],
      "lineCount": 1,
      "charCount": 23
    },
    {
      "id": "pdf-blank-lines-06",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "Paragraph A.\n\n\n\nParagraph B.",
      "output": "Paragraph A.\n\nParagraph B.",
      "steps": [
        {
          "op": "removeEmptyLines"
        }
      ],
      "lineCount": 3,
      "charCount": 26
    },
    {
      "id": "pdf-real-hyphen-07",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "well-known example\nstate-of-the-art model",
      "output": "well-known example\nstate-of-the-art model",
      "steps": [
        {
          "op": "trimText"
        },
        {
          "op": "removeExtraSpaces"
        }
      ],
      "lineCount": 2,
      "charCount": 41
    },
    {
      "id": "pdf-multicolumn-08",
      "kind": "observation",
      "generated": false,
      "status": "limitation",
      "summary": "Copied reading order interleaves columns (Left1 Right1 Left2 Right2). No transform on this site can recover layout intent.",
      "notes": ""
    },
    {
      "id": "pdf-bullets-09",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "• First item\n• Second item\n· Third item",
      "output": "• First item\n• Second item\n· Third item",
      "steps": [
        {
          "op": "trimText"
        }
      ],
      "lineCount": 3,
      "charCount": 39
    },
    {
      "id": "pdf-unicode-punct-10",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "“Smart quotes” and an em—dash with … ellipsis.",
      "output": "“Smart quotes” and an em—dash with … ellipsis.",
      "steps": [
        {
          "op": "identity"
        }
      ],
      "lineCount": 1,
      "charCount": 46
    },
    {
      "id": "pdf-joined-words-11",
      "kind": "observation",
      "generated": false,
      "status": "limitation",
      "summary": "Missing spaces (thequick brown) cannot be repaired reliably without a dictionary and language model.",
      "notes": ""
    },
    {
      "id": "pdf-paragraph-bounds-12",
      "kind": "pipeline",
      "generated": true,
      "status": "pass",
      "input": "  First paragraph line.  \n\n\n  Second paragraph line.  ",
      "output": "First paragraph line.\n\nSecond paragraph line.",
      "steps": [
        {
          "op": "trimText"
        },
        {
          "op": "removeExtraSpaces"
        },
        {
          "op": "removeEmptyLines"
        }
      ],
      "lineCount": 3,
      "charCount": 45
    }
  ]
}
