A free, ad-free document scanner and PDF creator for Android.
Point the camera at a page — it finds the edges, straightens the page, cleans it up, and saves
a PDF to Documents/minimalPdf. Read, annotate, sign and re-edit it, all inside the app.
⬇ Download the APK · 3.9 MB · Android 10+
- Scan with live page-edge detection, and drag the corners when it guesses wrong
- Filters — Original, Greyscale, B&W and a shadow-flattening Document mode, plus Enhance
- Draw with a brush: colour picker, presets, an eyedropper, adjustable size, undo
- Text and signatures — drag, resize, rotate. Signatures can be drawn on a pad or scanned off paper, with the ink lifted onto a transparent background
- Non-destructive — pages store instructions, never flattened pixels, so any page of any document can be reopened and re-edited with every slider where you left it
- In-app viewer — no hand-off to Drive or anything else
- No ads, no accounts, no subscriptions, no analytics. One permission:
CAMERA
git clone https://github.com/cgoxo/minimal-pdf.git
cd minimal-pdf
./gradlew installDebug # with a phone connected over USBOr open the folder in Android Studio and press ▶. Full walkthrough: Getting started.
Written for someone who has never built an Android app — see docs/.
| Getting started | Requirements, USB debugging, first run |
| Android basics | The vocabulary, tied to this codebase |
| Project structure | Every file, annotated |
| How it works | One page followed from camera to PDF |
| Key ideas | The five ideas behind most of the code |
| Architecture | Views vs logic, and is this MVVM? |
| Compose previews | Rendering UI without a device |
| Troubleshooting | When something goes wrong |
| Exercises | Ten changes to make, easiest first |
| Known limitations | What it does not do |
Kotlin and Jetpack Compose, minSdk 29. The interesting parts are written against the Android
platform rather than handed to a third-party SDK — no OpenCV, no ML Kit, no PDF library:
| Page detection | Sobel + a gradient-guided Hough transform, by hand |
| Perspective correction | Matrix.setPolyToPoly |
| Filters | ColorMatrix, plus summed-area tables for local-mean work |
| PDF writing | android.graphics.pdf.PdfDocument |
| PDF viewing | android.graphics.pdf.PdfRenderer |
| Camera | CameraX |