# Changelog of PDF Text Extractor & Markdown for LLM RAG: OCR, Tables, Chunks (`pankovs/pdf-to-llm-markdown`) Actor

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

## Changelog

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 `chunksMeta` `headings` 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 `chunksMeta` `headings` 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.

### 0.1.5 (2026-10-10, public launch)

#### Added

- Clean Markdown from PDFs: headings, lists, reading order, repeated headers/footers removed.
- Tables converted to GitHub-flavored Markdown tables; tables split across pages are merged.
- OCR for scanned pages in 10 languages: English, Russian, German, French, Spanish, Portuguese, Italian, Polish, Latvian, Ukrainian.
- Optional RAG chunks with size and overlap; tables are never split.
- Filled PDF form fields are included in the output.
- Arabic and Hebrew text in correct logical order.

#### Changed

- Pricing aligned with the market: $0.0026 per document + $0.00012 per text page, $0.01 per OCR page (a 20-page text PDF costs about $0.005).

#### Fixed (hardened before launch)

- Servers that reject requests without a browser User-Agent (403) now work.
- Temporary server errors (5xx) are retried before giving up.
- OCR no longer replaces a better text layer, and is not charged when it adds nothing.
- Wrong OCR language chosen: the page is re-read with the right script automatically and charged once.
- Pages in unsupported scripts or with low-confidence OCR are flagged and not charged.
- Blank and image-only pages are not charged.
- Content repeated on every page is no longer removed when it is the only content.
