Convert PDF to clean Markdown for LLM & RAG pipelines: text extractor with OCR fallback (50 languages), GitHub-flavored table reconstruction (incl. tables spanning pages), right-to-left script support, and optional RAG chunking. ~$0.005 for a 20-page text PDF. Pay only for pages with real text.
All notable changes to PDF to Markdown for LLM & RAG. Sections: Added, Changed, Fixed.
0.2.10 (2026-10-14)
Changed
New prices: document $0.00416 (was $0.0026) and text-page $0.000192 (was $0.00012), so a 20-page text PDF now costs $0.008 (was $0.005). ocr-page stays at $0.01. Runs also carry Apify's standard start event ($0.00005 per GB of memory), which lets Apify cover the first 5 seconds of every run.
Runs use 2 GB of memory by default and at most 2 GB. The heaviest OCR runs in our tests peak below 600 MB, so more memory only added cost.
Fixed
Pages whose lines are made of many short numbers (for example long tables of figures printed as one line) are read several times faster, so such files no longer slow a run down.
Pages where many small side-by-side boxes sit next to full-width lines are no longer slow to scan for tables. They come out as plain paragraphs with a warning naming the page, like other pages too packed to search for tables.
0.2.9 (2026-10-13)
Fixed
A table of contents that lines up page numbers with spaces instead of dot leaders (1 Introduction 3, 2 Approach 6) no longer turns into headings. Before, papers like GPT-3 got a second copy of every top level section title, with the page number stuck on, right at the start of the document.
Big text labels inside figures (for example Input-Input Layer5 repeated over each attention chart in the appendix of "Attention Is All You Need") no longer become headings, and no longer get glued onto the real section title next to them. The appendix now starts with a clean Attention Visualizations heading, so chunksMetaheadings cites the real section there.
Pages where tens of thousands of words sit on one very long line are processed several times faster, so such files no longer slow a run down.
0.2.7 (2026-10-13)
Fixed
Numbered section titles printed in bold at the normal text size, as in most two-column academic papers (1 Introduction, 2.2 Architecture), are now Markdown headings. Before, only titles in a larger font were found, so a paper like the LLaMA paper got a single heading in 27 pages. Subsections are nested by their number (3.1 under 3, 3.2.1 under 3.2), so chunksMetaheadings now gives the full section path, for example ["Attention Is All You Need", "3 Model Architecture", "3.2 Attention", "3.2.1 Scaled Dot-Product Attention"].
0.2.6 (2026-10-13)
Fixed
With ocrMode set to never, a page with no text layer (for example a scanned page) is now flagged in warnings (Page 1 has no extractable text and OCR was not run (ocrMode=never)...) instead of coming back as a silently empty page. The page is still free.
0.2.5 (2026-10-12)
Added
Every RAG chunk now comes with its page range and section: a new chunksMeta list (one entry per chunk, same order) gives pageStart, pageEnd and headings, so answers can cite "page 4, section 3.2". The chunks list stays the same plain text list as before.
New pagesProcessed field: how many pages were actually converted.
Changed
RAG chunks end at a natural boundary instead of exactly every chunkSize characters: before a heading, at a paragraph or sentence end, or at least between words, within 15% of chunkSize. Words are no longer cut in half (...Long Bea / y over 2 BLEU), a heading is no longer left at the end of a chunk, and the overlap starts at the beginning of a word.
metadata.created is always an ISO 8601 date in UTC when the PDF has a readable date, including old free-text dates like Tuesday, 21 September, 1999 5:45:50 PM. Time zone offsets in PDF dates are now applied.
Fixed
When maxPagesPerPdf stops before the end of a PDF, the item now says so in warnings (for example Stopped at maxPagesPerPdf=6 of 28 pages). Before, the rest of the document was skipped silently.
A link that returns an empty file now fails with "empty response" instead of a confusing "missing %PDF- magic bytes" message.
A chunkOverlap close to chunkSize no longer makes a run crawl or return a huge number of nearly identical chunks. The overlap is now at most half of chunkSize; a larger value is reduced and the item says so in warnings.
Very long lines and very long paragraphs (for example a page of text with no spaces) are converted quickly instead of slowing the run down.
Scanned pages with two or more columns are read column by column, with a blank line between paragraphs. Before, a scan came out as one long line with the columns mixed line by line, and some lines (like a subtitle) could go missing. OCR pricing is unchanged.
Footers whose page number switches sides on even and odd pages (2 Publication 1040 (2025), Publication 1040 (2025) 3) are now removed like other repeated footers instead of showing up as a heading on every page.
A title printed one word per line (TAX AND / EARNED / INCOME) becomes one heading, and a long sentence in a slightly larger font (like a licence note above a paper title) stays a normal paragraph instead of a heading per line.
The rotated arXiv id in the left margin of arXiv papers (arXiv:1706.03762v7 [cs.CL] 2 Aug 2023) no longer appears as a big heading in the middle of the text. Table of contents lines with dot leaders are no longer headings.
Double-spaced documents (for example the UN Universal Declaration of Human Rights in Russian) keep their paragraphs instead of putting every printed line in its own paragraph.
0.2.4 (2026-10-12)
Fixed
No more stray spaces inside numbers, words and punctuation in PDFs made with LaTeX, MS Word and similar tools: 28.4 instead of 28 . 4, 1948 года. instead of 1948 года ., step_num instead of step _ num.
Old scanned documents with a letter-spaced text layer (for example UN documents from the 1980s) now read as normal words (Requests the Secretariat) instead of R e q u e s t s.
Hyphenated words split across lines keep their hyphen when it is part of the word: English-to-German, LLaMA-65B (was Englishto-German, LLaMA- 65B).
Arabic from MS Word PDFs (UN and government documents) no longer swaps letters in words like الجمعية, المتحدة and في.
Powers of ten in scientific tables keep their exponent readable: 2.3 · 10^19 instead of 2.3 · 1019.
Dense tables printed side by side, like the IRS tax tables, now come out as separate tables with one row per printed line. Before, rows from neighbouring blocks could end up in the same cell (1,025 1,050) and the first rows of a block could fall out of the table.
Tables from scientific papers keep all their rows and their header: rows below a rule with a value centered across two columns (for example the Transformer rows in "Attention Is All You Need", Table 2) stay in the table, and the Model | BLEU | Training Cost header is kept.
Rows that start with an empty first cell are no longer glued to the row above (7B 13B in one cell). A model or group name printed once for several rows (like LLaMA next to 7B, 13B, 33B, 65B) is now repeated on each of its rows.
A table printed next to a text column is no longer mixed with that text.
Dense tables with hundreds of rows are rebuilt many times faster (a 120-row, 10-column table page: from about 2 seconds to under 0.1 seconds). On a page packed with thousands of tiny text cells, table search is skipped: the text comes out as plain paragraphs, the page is charged as a normal text page, and a warning names the page.
0.2.3 (2026-10-11)
Fixed
Security: PDF links that point to private or internal network addresses written in IPv6 form (for example http://[::ffff:127.0.0.1]/), or that redirect to them, are now refused like their IPv4 equivalents. The item gets a clear error and nothing is charged. Public PDF links work as before.
0.2.1 (2026-10-11)
Added
OCR for scanned pages in 50 languages (was 10), including Greek, Arabic, Hebrew, Persian, Hindi, Bengali, Tamil, Thai, Vietnamese, Chinese, Japanese, Korean, Turkish, Dutch, Swedish, Czech and more. All languages are built in: no extra download time on the first page.
Automatic script detection: if a scan is in a script your ocrLanguages don't cover (e.g. a Greek or Chinese page with the default eng), the page is re-read with the right language and a warning tells you which setting to use.
Changed
ocrLanguages accepts up to 5 languages. A longer list stops the run right away with a clear message, and nothing is charged (more languages made OCR much slower and less accurate).
Clearer Store listing: new title and description, a one-line summary of what sets the Actor apart, and OCR model attribution in the README.
Fixed
Chinese and Japanese OCR text no longer has spaces between every character.