# truecopy vs PDFExcavator Source: https://truecopy.dev/compare/pdfexcavator/ PDFExcavator is a far richer extractor - characters, graphics, OCR, CJK, nested tables. It answers "what is on this page". truecopy answers "should I believe what came back". Reach for both. **Short answer.** These are not rivals, and the comparison table below is the shortest way to see why: almost every row is a thing one of them does and the other never will. PDFExcavator is the closest neighbour truecopy has: same language, same runtime family, both built on `pdfjs-dist`, both MIT. It is also a much bigger extractor, and if your problem is _getting more out of the page_, it is the one to reach for. ## What PDFExcavator does better, and it is a long list - **Characters, not just cells.** Character, word, line and paragraph level, with positions, fonts and colours. truecopy sees positioned text and stops there. - **Graphics.** Lines, rectangles, curves, images, annotations. truecopy reads none of it. - **OCR.** Tesseract.js integration for scanned documents. truecopy **refuses** a scan by name (`no-text`) and will never ship an OCR engine. - **Nested and borderless tables**, with a confidence score of its own. - **CJK, font substitution, multi-column reading order, PDF repair, visual debugging.** None of these exist here. It describes itself as the JavaScript alternative to Python's pdfplumber, and on this list that is a fair claim. ## What truecopy does that it does not One thing, and everything here is a consequence of it: **truecopy decides whether to believe the reading.** A confidence score is a number about a table. It is not the same as: - a reading that is set against **what the document declares about itself** (a total, a closing balance) and cannot come back as sound when the two disagree ([`contract`](https://truecopy.dev/docs/contract/)); - a row rejected because it breaks the shape **every other row shares**, with no list of forbidden words, so it works on an issuer nobody has seen ([`signature`](https://truecopy.dev/docs/signature/)); - a document refused for being **the wrong kind of document** ([`classify`](https://truecopy.dev/docs/classify/)); - six rules that run as assertions in **your** test suite, over **your** corpus, so the day your reader quietly stops checking itself, your gate goes red ([`kit`](https://truecopy.dev/docs/kit/)). There is also a runtime difference worth knowing before you choose: PDFExcavator presents itself as a Node.js library. truecopy runs in the browser too, which is what lets [the demo](https://truecopy.dev/demo/) read your file without a server on the other end of it. ## The honest recommendation: use both This is not a diplomatic ending, it is the design. truecopy never opens a format on its own: [`open`](https://truecopy.dev/docs/open/) takes **your** extractor, and the conformance kit requires one for exactly this reason: a kit that supplies the extractor stops measuring your reader and starts measuring itself. So PDFExcavator can be the thing that reads the page, and truecopy the thing that decides whether the result is trustworthy enough to act on. If you need characters, graphics or OCR, that is not a compromise: it is the only combination that gets you both. Reach for PDFExcavator alone when a person looks at every result. Add this when something downstream acts on the rows without one. Map of this site for a model: https://truecopy.dev/llms.txt Every page in one file: https://truecopy.dev/llms-full.txt