94 lines
2.9 KiB
Markdown
94 lines
2.9 KiB
Markdown
# XRayPDF
|
|
|
|
XRayPDF is a web app for sanitizing PDFs by extracting suspicious hidden content and producing cleaner outputs.
|
|
|
|
Instead of only "finding" hidden text, the pipeline is designed to help you remove or neutralize hidden layers by generating processed page images and exportable PDFs.
|
|
|
|
## What the app does
|
|
|
|
- Uploads a PDF (up to 10MB)
|
|
- Renders each page server-side into images
|
|
- Runs pixel sanitization on each page to neutralize low-contrast/hidden overlays
|
|
- Runs per-page Tesseract OCR for text verification
|
|
- Lets you review outputs in a 3-panel viewer (Original / Pixel / OCR)
|
|
- Lets you download per-page files or convert processed pages into a single PDF
|
|
|
|
## Extraction + removal workflow
|
|
|
|
1. **Render original pages**
|
|
- Each PDF page is rasterized to a PNG on the server.
|
|
- This gives a deterministic image baseline for analysis.
|
|
|
|
2. **Pixel sanitization (removal path)**
|
|
- Every rendered page goes through image processing (`sharp`):
|
|
- flatten alpha to white background
|
|
- grayscale
|
|
- normalize contrast
|
|
- sharpen edges
|
|
- Goal: make suspicious low-contrast hidden layers obvious and easier to remove/ignore in sanitized exports.
|
|
|
|
3. **OCR verification (trust but verify)**
|
|
- Tesseract runs page-by-page on server-rendered images.
|
|
- OCR text output helps validate what was present, even when visuals are ambiguous.
|
|
- If a processed image is not convincing, use OCR text as the secondary evidence channel.
|
|
|
|
4. **Download + PDF conversion**
|
|
- Download all per-page PNG/TXT files directly.
|
|
- Use the **PDF** button (Original and Pixel panels) to convert page images into one downloadable PDF.
|
|
|
|
## How to use OCR output to find hidden text
|
|
|
|
If the image result looks unclear:
|
|
|
|
- Open the OCR panel and inspect text per page.
|
|
- Check low-confidence pages manually in the image panels.
|
|
- Compare OCR text against expected visible text from the original.
|
|
- Unexpected words, extra lines, or mismatched answers can indicate hidden content that the eye missed.
|
|
|
|
## Stack
|
|
|
|
- Next.js App Router
|
|
- Prisma + PostgreSQL
|
|
- NextAuth (Google)
|
|
- `pdfjs-dist` for PDF parsing
|
|
- `@napi-rs/canvas` for server-side rendering
|
|
- `sharp` for image processing
|
|
- `tesseract.js` for OCR
|
|
- `pdf-lib` for image-to-PDF export
|
|
|
|
## Local development
|
|
|
|
```bash
|
|
cd client
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
Open http://localhost:3000
|
|
|
|
## Production Docker
|
|
|
|
Build:
|
|
|
|
```bash
|
|
cd client
|
|
docker build -t xraypdf:latest .
|
|
```
|
|
|
|
Run:
|
|
|
|
```bash
|
|
docker run --rm -p 3000:3000 \
|
|
-e DATABASE_URL="postgresql://user:pass@host:5432/db" \
|
|
-e NEXTAUTH_SECRET="your-secret" \
|
|
-e NEXTAUTH_URL="http://localhost:3000" \
|
|
-e GOOGLE_CLIENT_ID="your-google-client-id" \
|
|
-e GOOGLE_CLIENT_SECRET="your-google-client-secret" \
|
|
xraypdf:latest
|
|
```
|
|
|
|
## Notes
|
|
|
|
- OCR is designed as a verification step and should be reviewed with page images.
|
|
- For best results, re-run analysis on a fresh upload if source PDF structure changes.
|