PDF to Markdown Converter: Text, Tables, CSV avatar

PDF to Markdown Converter: Text, Tables, CSV

Pricing

from $4.00 / 1,000 document converteds

Go to Apify Store
PDF to Markdown Converter: Text, Tables, CSV

PDF to Markdown Converter: Text, Tables, CSV

Convert PDFs to clean Markdown with headings, lists and tables, plus plain text and one CSV per table. Public URLs or uploaded files, up to 2,000 pages each. Scanned pages are reported, not billed, and unreadable files are free error rows. Built for RAG and AI agents.

Pricing

from $4.00 / 1,000 document converteds

Rating

0.0

(0)

Developer

kelp forest

kelp forest

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Share

Give it PDF links (or upload a PDF). For each document you get clean Markdown (headings, paragraphs, bullet and numbered lists, tables), the plain text layer, and every ruled table as rows and as a CSV file.

Use cases

  • Prepare reports, manuals and papers for RAG and vector databases.
  • Pull tables out of PDFs into CSV for spreadsheets.
  • Give AI agents readable text from PDF links.
  • Bulk-convert document archives to Markdown for search.

What it does

  • Rebuilds headings from font sizes (#, ##, ###), re-joins wrapped lines into paragraphs and turns bullets into Markdown lists.
  • Detects ruled tables, renders them as Markdown tables (pipes escaped) and keeps their cells out of the paragraph text.
  • Saves the full .md, .txt and one .csv per table in the run's key-value store, with links in each row.
  • Reports pages that have no text layer (scans), so you know to send them to OCR instead.
  • Detects regular column layouts (papers, newsletters) and reads them column by column, left to right, keeping full-width titles in place. Two-column pages are listed in twoColumnPages and pages with three or more columns in multiColumnPages, each with a warning, because the order around figures, tables, footnotes and text that spans only some columns may still need a check. Pages where text sits side by side but does not look like regular columns (a sidebar, a short last page, or a possible borderless table whose cells line up row by row) are not reordered; they are listed in mixedLayoutPages with a warning so you know to check them.
  • Accepts public URLs, Apify start URLs, or a file uploaded in the Console.

Pricing (pay per event)

EventPrice
document (one PDF converted)US$0.004
page (one converted page with a text layer)US$0.0002

Example: a 10-page PDF costs US$0.004 + 10 × US$0.0002 = US$0.006; a 50-page PDF costs US$0.014. Failures are free: files that are not PDFs, password-protected or damaged PDFs, downloads answering HTTP 400 or higher, blocked targets, and scanned PDFs with no text layer produce an error row and no charge. Pages beyond maxPagesPerDocument and pages with no text layer are not billed.

Each run also has Apify's run-start charge of US$0.00005 per GB of run memory (US$0.00005 at the default 1024 MB), charged when the run starts, even if every document fails.

Maximum charge per run: before each document, the actor checks that the document fee fits in what is left of your maximum charge; if it does not, the PDF is not downloaded and you get a free row saying so. The document fee is charged when the row is saved, then the pages that still fit; if only some pages fit, the full text is delivered, pagesCharged says how many were billed, and the run stops after that document.

How to use

  1. Open the actor in Apify Console and fill in the input form (or paste the JSON example below into the JSON editor).
  2. Optional: set a maximum charge for the run under the run options to cap what a run can cost.
  3. Click Start. Results appear in the Output tab as they are produced; export them as JSON, CSV, Excel or HTML.

You can also start runs from the Apify API or CLI, run the actor on a schedule (for example weekly), and send results to other apps with Apify integrations and webhooks.

Input example

{"pdfUrls": ["https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"], "maxPagesPerDocument": 100, "extractTables": true}

Output example (local fixture run, Oct 7, 2026; trimmed)

{"url": "https://example.com/report.pdf", "status": "ok", "title": "Quarterly Fixture Report", "pages": 2, "pagesTotal": 3, "pagesCharged": 2,
"markdown": "# Quarterly Fixture Report\n\nThis paragraph explains ...\n\n## Key points\n\n- First point about revenue\n- Second point about costs\n\n| Region | Q1 | Q2 |\n|---|---|---|\n| BC | 120 | 135 |\n...",
"tables": [{"page": 1, "index": 1, "rows": [["Region", "Q1", "Q2"], ["BC", "120", "135"]], "csvUrl": "https://api.apify.com/v2/key-value-stores/<store-id>/records/report-....csv"}],
"tableCount": 1, "warnings": ["only the first 2 of 3 pages were converted (maxPagesPerDocument)"], "charges": {"document": 1, "page": 2}}

FAQ

Does it do OCR? No. Pages without a text layer (scans) are listed in the output and not billed; use an OCR tool for those.

How are tables detected? Tables with ruling lines are detected and exported as Markdown and CSV. Tables without lines are not exported as tables: their text is read across the page, row by row. If the cells hold wrapped text, the page gets a 'possible borderless table' warning and is listed in mixedLayoutPages.

What does a 10-page PDF cost? US$0.004 + 10 x US$0.0002 = US$0.006. A 50-page PDF costs US$0.014. Each run adds Apify's run-start charge (US$0.00005 per GB of memory, US$0.00005 at the default 1024 MB).

Are my files kept? Only in your own run storage, under your account's data retention.

Does it handle two-column layouts? Yes, for regular column layouts (papers, newsletters): the text is read column by column, left to right, and the row gets a warning plus twoColumnPages or multiColumnPages (three or more columns) so you can check the order around figures, tables and footnotes. Text that sits side by side but does not look like regular columns (a sidebar, or a borderless table whose cells line up row by row) is not reordered; those pages are listed in mixedLayoutPages with a warning.

Limits: what this actor does not do

  • No OCR: scanned pages without a text layer are reported, not read.
  • No password cracking: protected PDFs are skipped (free).
  • Tables without ruling lines are not exported as tables. Their text is read row by row, so a row stays together, but the lines of wrapped cells in one row can be interleaved; such pages get a "possible borderless table" warning in mixedLayoutPages. Sidebars and text spanning only some columns are flagged in mixedLayoutPages too and not reordered.
  • A borderless table may still be read column by column (and labelled as columns) if almost every cell (about 70% or more) ends like a sentence (. ? ! : ;) and, in every row, all cells have the same number of lines, because it then looks exactly like columns of evenly spaced paragraphs.
  • Borderless tables with very tight rows (0-1 pt row padding) or vertically centred cells may still be read as columns. So may a page that holds only two rows of a table, whether it is a stand-alone 2-row table or the last page of a longer one.
  • Each download must finish within 2 minutes (a server that sends data very slowly gets a free error row, and the next PDF goes ahead).
  • No private, loopback or cloud-metadata addresses (an SSRF guard checks every redirect hop). Files are kept only in your run's storage.

Changelog

  • 1.0 (October 2026): first public version.