Turn Scanned PDFs into Editable Markdown or EPUB with Python
You've probably got a folder of scanned books or research papers sitting around—PDFs where the text is just pixels on a page. You can't search them, you can't copy a quote, and you definitely can't read them comfortably on an e-reader. PDF Craft is a Python library that takes those scanned files and turns them into editable Markdown or reader-friendly EPUB, and it does some genuinely useful things along the way.
What It Does
PDF Craft is built for scanned books, research papers, and technical documents. It converts scanned PDFs into Markdown (with text and image assets) or EPUB (with book metadata and a table of contents). Along the way, it recognizes body text, chapters, tables of contents, footnotes, tables, formulas, and images, so the output is structured rather than just a wall of extracted characters.
It also handles translation. You can translate content during conversion, or translate an existing EPUB, with both translation-only and bilingual output modes. There's even an option to write translations back onto the original PDF pages. The project is on PyPI, MIT-licensed, and ships with an official online service at pdfcraft.ai if you'd rather not set up the Python side yourself.
Why It's Cool
-
It targets the hard part. Plenty of tools extract text from PDFs. Fewer care about chapters, footnotes, tables of contents, and formulas—the structural stuff that makes a converted document actually usable. The README is explicit that it recognizes these elements, which is the difference between a dump of text and something you can read.
-
Two output formats for two different jobs. Markdown is for when you want to edit, search, and process the content. EPUB is for when you want to sit back and read the book on an ebook reader, complete with metadata and a TOC. Same input, two sensible destinations.
-
Translation is built in, not bolted on. Being able to translate during conversion or translate an existing EPUB—and to produce bilingual output—is a nice touch for anyone working across languages. Writing translations back onto the original PDF pages is a clever option I don't see often.
-
There's an honest caveat. The README says results depend on scan quality, page layout, and the OCR model, and recommends checking a representative document before processing a larger collection. That's the kind of honesty you want from a conversion tool—scan quality varies wildly, and no library will save a badly photographed page.
-
A no-install escape hatch. If you just have one PDF and don't want to deal with Python, CUDA, or OCR provider API keys, the official online service handles the conversion in a browser. It's a practical on-ramp before you commit to the library.
How to Try It
The library is on PyPI, so installation should be a standard pip install:
pip install pdf-craft
The README points you to a Python quick start section and full documentation for usage details—the API examples live there, so check those before writing your own pipeline. In broad strokes, you'll feed it a scanned PDF and choose your output: Markdown with text and image assets, or EPUB with metadata and a table of contents. If you're translating, you'll pick between translation-only and bilingual modes.
If you'd rather skip setup entirely, head to pdfcraft.ai/pdf-craft, upload your file, submit the task, and download the result when it's ready.
The repository, source, and full docs are at github.com/oomol-lab/pdf-craft.
Final Thoughts
PDF Craft is best suited to people with a real backlog of scanned material—students, researchers, or anyone digitizing a personal library—who want structured output rather than raw text. It's not magic: your results will track your scan quality, so test a representative page before batch-processing a shelf. But the combination of structural recognition, dual output formats, and built-in translation covers a lot of ground in one library, and the online option lowers the barrier to trying it. If you've been putting off that scanned-book project, this is a reasonable place to start.