# Changelog of PDF to Markdown OCR Converter: Scanned PDFs & Images to Text (`brasspage/pdf-ocr-to-markdown`) Actor

- **URL**: https://apify.com/brasspage/pdf-ocr-to-markdown/changelog.md
- **Full Actor documentation**: https://apify.com/brasspage/pdf-ocr-to-markdown.md

## Changelog

### 0.1, 2026-11-05

- Large scans use less memory, and a picture too large for the run no longer ends it. Before, some 100 MB PDFs ran out of memory, and the run lost every page. Now freed page memory goes back to the system, and a page with one picture too large for the run fails alone, with a clear error and no charge. Other pages read as before.
- A second reader for pages that Tesseract reads badly (build 0.1.43). When an English page comes out weak, RapidOCR reads it too, inside the Actor, and its text is used if it finds clearly more. Such a page has `reader: RapidOCR` and a warning. On real handwritten notes, words found went from 16% to 52%, and on real receipts from 46% to 67%. On our 255 regression files and 16 dense form pictures, no output changed. The price stays the same, and files still go to no LLM or outside API. It needs 1 GB of memory or more. Set `secondReader` to `false` for Tesseract only. Its weak spot is line order: on a receipt, the prices can come out apart from their items.

### 0.1, 2026-11-04

- Listing only, no code change (build 0.1.41, same output as 0.1.40). The README now has a real Apify run: a 20-page PDF of phone photos at 1 GB gave 75% of the words in 14 minutes, about 42 seconds a page.
- Phone photos of whole pages read far better. On a shadowed page, the page turn check found no text, so a sideways page was read sideways. The check now looks at the page with its light evened out, and the OCR still reads the page as it is. On 20 new phone photos at 1 GB, words found went from 23% to 77%. Flat book scans give the same output.
- Listing only, no code change (build 0.1.39, same output as 0.1.38). The title now says "Converter", and the description and the README opening say the Markdown is for LLMs, RAG and AI agents.
- Phone photos and large pages no longer fail at the default 1 GB. Many phones mark a photo as 72 dpi, so the Actor enlarged it to 40 megapixels, which needs about 2.2 GB. The run then ran out of memory. Now the page size follows the run's memory: up to about 13 megapixels at 1 GB, and 40 at 4 GB. Pages under that size give the same output as before (60 of 60 book scans).
- README: the limits now come from the full Actor on real photos from three public test sets. It found 25% of the words on phone photos of whole pages, 38% on receipts and 17% on handwritten notes.

### 0.1, 2026-11-03

- Scanned tables with no grid lines now come out as Markdown tables. The column finder from Nov 2 now also runs on the OCR words. In a number column, a cell that the page reading got as letters ("7" read as "N") is read again on its own, and the new reading is used only when it is a number. On 134 made-up scanned tables made after the code was frozen, 74% of cells are right, was 45%, and 18 are exact, was 6. No file got worse. Scanned ruled tables, 24 scanned invoices, 8 dense forms and table screenshots give the same scores as before. 156 digital PDF tables and 71 other page images give the same output.

### 0.1, 2026-11-02

- PDFs that another tool already OCRed (OCRmyPDF, Tesseract) read right. Before, each letter of such a page could come out on its own ("s c h oo l"). The cause: the hidden text sits at a small tilt, and each letter got its own text size. On 30 book page scans that the code never saw, OCRmyPDF output gave 91% of the words, was 79%. Hidden text that is tilted more than 0.8 degrees is now OCRed again: 89% to 91%, was 3% to 6%.
- Upright handwritten pages are no longer turned upside down before OCR. On 3 such test pages, words found went from 1% or less to 47% to 56%. Printed pages turn as before.
- Digital PDF tables with no full grid lines now come out as Markdown tables. The Actor finds the columns from the empty strips that no word crosses, so narrow gaps and wrapped cells work too. On a fresh set of 67 made-up tables like this, made after the code was frozen, 48 come out exact, was 17, and 86% of cells are right, was 47%. Ruled tables, scanned pages and the rest of each page read as before. On 178 other text pages from our test files, 20 changed and no words were lost.
- README: shorter and easier to scan, with the price, a table of measured results and the limits near the top. No code changed.

### 0.1, 2026-10-31

- README: a scanned invoice example with its input and its full Markdown table. It says near the top that documents go to no LLM or outside API. No code changed.
- Pages scanned sideways or upside down are turned upright before OCR, and the page gets a warning that says so. Before, such a page gave text that made no sense (0 of 36 numbers on a test invoice), with no warning. On 102 test pages, each turned 90, 180 and 270 degrees, all 306 now give the same text as the upright page. Upright pages give the same output as before. The check adds about 0.13 seconds a scanned page on our Mac.
- Scanned pages are faster, with the same output. The noise filter, the ruled line finder and the image files for OCR use less computing. On Apify at 1 GB, 3 made-up scans took 19 and 29 seconds, was 65 (two runs each). On 116 test files, every output is the same as before.
- Fixed two lines of text. The prefilled 6-page W-9 run takes about 6 seconds, not 3. A record from a private key-value store needs its signed URL.

### 0.1, 2026-10-30

- Scanned forms read better. Lines that run across the whole form (a header box, rows of name boxes) are no longer read as part of a ruled table below them, which lost their text. On 8 made-up dense form pages, scans now give 407 of 438 pieces of text, was 359. Invoice and table results did not change.
- Screenshots read better: light grid lines, small text, tables with no lines and bullet lists. A table screenshot with 44 cells now gives all 44 right.
- Tables are faster: all the cells of a table are read in one or two OCR runs, not one run per cell. One table screenshot on Apify: 6.6 seconds, was 10.8.
- A blank page gives empty text and is not charged. Before, a page that was all one color failed.
- A scanned table with only a line under the header now gives all 44 of 44 cells in our test. A lone digit read as a mark (a "5" read as "\*") is read again.

### 0.1, 2026-10-29

- Text is now read inside the Actor with free, open source OCR (Tesseract 5). No page is sent to an outside AI service.
- Digital PDFs are read from their own text layer, so their text is exact. Only scanned pages are OCRed.
- Scans are rendered at 300 dpi, deskewed and cleaned before OCR. Ruled tables are read cell by cell.
- Numbers in scanned tables are checked: a row where quantity times price does not equal the amount gets a warning, and a lost decimal point is restored only when the row proves it.
- New `language` input for scanned pages (10 languages).
- Each page now has `source` (text layer or ocr), and OCR pages have `meanConfidence` and any `warnings`.
- `extraTokenBlocks` is always 0: the price is a flat $0.006 per page.

### 0.1, 2026-10-27

- Title and description lead with "PDF to Markdown" and "scanned PDFs".
- README: three runnable input examples with public files (a research paper, a scanned page, a tax form).

### 0.1, 2026-10-25

- Lower start fee: $0.00005 per run.
- The prefilled sample run and its output now show on the first screen of the README.
- Clearer title, description and README opening for Store search.

### 0.1, 2026-10-15

- First release: PDFs and images (PNG, JPEG, WEBP, TIFF) to Markdown or plain text, $0.006 per page.
- Dense pages are priced by extra 1,000-token blocks, so a run never goes over your maximum cost.
- Free plan: a trial of 20 pages per run and 50 pages per month.
