PDF to Markdown – Text, Tables & Chinese/CJK for LLMs (No OCR)
Pricing
Pay per event
PDF to Markdown – Text, Tables & Chinese/CJK for LLMs (No OCR)
Convert text-based PDFs to clean Markdown or plain text for LLMs and RAG: reading order for two-column papers, Markdown tables, Traditional and Simplified Chinese; garbled pages are flagged. Scanned PDFs are detected and not charged (no OCR).
Pricing
Pay per event
Rating
0.0
(0)
Developer
星賢 陳
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Security
Limited permissionsShare
Turn PDFs that already contain text into clean Markdown (headings, paragraphs, Markdown tables) or plain text, ready for LLM prompts, RAG chunking and search indexing. Built for, and checked in internal tests (Oct 2026) on, Traditional Chinese, Simplified Chinese and English PDFs, including two-column journal papers and table-heavy reports.
Unofficial tool. This Actor is independent and is not affiliated with, endorsed by or sponsored by Adobe, the PDF Association, or any publisher whose documents you convert. You are responsible for having the right to process the documents you submit.
What it does
- Downloads each PDF URL (up to 50 MB by default, configurable up to 200 MB) and reads its text layer. Rate-limited hosts (HTTP 429) are retried politely with back-off that respects
Retry-After. - Restores reading order (column detection, so two-column papers are not interleaved line by line), re-joins wrapped lines into paragraphs, and removes the spaces that justified CJK text often stores between characters.
- Detects headings by font size (
#/##) and converts ruled tables to Markdown tables. - Fixes common extraction artefacts: ligatures (fi → fi), Symbol/Wingdings private-use bullets and brackets, rotated margin stamps.
- Checks every page for garbled text (mojibake,
(cid:NN)glyphs, replacement and private-use characters) and leaves such pages out instead of returning junk. - Detects scanned / image-only PDFs and pages with no text layer, and reports them in
statusandnotes. - One dataset item per document, plus a full
.md/.txtfile per document in the run's key-value store.
Limitations (please read)
- No OCR. Scanned PDFs, photographed pages, slides exported as images and PDFs whose text is drawn as vector outlines are not converted. They are reported as
scanned-no-text-layer(whole document) or listed innotes(individual pages). These pages are not charged. - Tables without ruling lines ("three-line" academic tables) come out as text, not as Markdown tables.
- Mathematical formulas are not reconstructed. Symbols may be out of place, and a few math glyphs may appear as
(cid:NN). - Paragraphs that continue across a column or page break are split at the break.
- Encrypted or damaged PDFs fail with a clear error and are not charged.
- Only public
http(s)URLs are accepted. No local or private-network addresses, and no login-protected files.
Input
| Field | Default | Description |
|---|---|---|
urls | – | Direct links to PDF files (required) |
outputFormat | markdown | markdown (headings and tables) or text (plain text; pages separated by form feed) |
maxPagesPerDocument | 500 | Only the first N pages are processed and charged (cap 2000) |
extractTables | true | Convert ruled tables to Markdown tables |
includePages | false | Also return the content of each page separately in pages (for chunking or citations) |
maxFileSizeMb | 50 | Larger files are rejected without a charge |
Output (real example)
Input: the Central Bank of the Republic of China (Taiwan) board-meeting resolution PDF (Traditional Chinese, two columns). Dataset item fields: url, status (ok / partial / scanned-no-text-layer / garbled / error), pageCount, pagesConverted, chargedPages, tablesFound, content, contentFile (link to the full file), notes, pageStatus, metadata, error.
{"url": "https://www.cbc.gov.tw/dl-227271-2a727785de8e4e12ab78cdf02a1fbc27.html", "status": "ok", "pageCount": 4, "pagesConverted": 4, "chargedPages": 4}
content (start):
<!-- page 1 -->中央銀行理監事聯席會議決議∣ 1## 中央銀行理監事聯席會議決議(115年6月18日發布)一、國際經濟金融情勢本(2026)年3月本行理事會會議以來,人工智慧(AI)相關投資持續增加,全球製造業景氣續呈擴張;惟中東衝突影響全球能源供給,主要國際機構預期國際原油等大宗商品價格居高,推升全球通膨壓力,並抑制全球需求,進而下修本年全球經濟成長率預測值,並上修本年全球通膨率預測值。近日隨美、伊達成初步協議,原油價格已明顯回降。近月以來,歐洲央行(ECB)轉向升息;日本央行(BoJ)重啟升息;美國聯邦準備體系(Fed)雖維持政策利率不變,但貨幣政策立場趨向緊縮;中國人民銀行則延續寬鬆貨幣政策。近期市場對主要經濟體央行貨幣政策立場轉變之預期,以及對AI產業鏈股價是否高估之疑慮,加劇國際金融市場波動。展望未來,中東局勢後續發展、主要央行貨幣政策動向、美國經貿政策變化,以及AI產業前景等,均增添全球經濟金融前景之不確定性。二、國內經濟金融情勢(一) 本年第1季,受惠AI等新興科技應用需求強勁,出口大幅成長,民間投資穩健擴增,加以民間消費增溫,經濟成長遠優於預期;預期第2季經濟續呈高度成長。勞動市場方面,與上(2025)年同期相比,本年1至4月平均失業率下降,就業人數上升;薪資溫和成長。至於下半年,新興科技應用商機持續拓展,將續帶動台灣出口穩健擴張,並挹注民間投資動能,民間消費可望持續成長。本行上修本年台灣經濟成長率預測值為9.45%(主要機構預測值詳附表1)。(二) 本年1至5月平均消費者物價指數(CPI)年增率為1.52%,不含蔬果及能源之核心CPI年增率則為1.96%。由於主要國際機構上修本年全年國際油價預測值,加以我國進口物價持續上揚,且服務類通膨轉趨上升,惟在考量政府能源價格平穩機制下,本行略上修本年台灣CPI及核心CPI年增率預測值分別為1.91%、1.90% (主要機構預測值詳附表2)。國際地緣政治風險及天候因素,可能影響未來國內通膨趨勢。(三) 近月長短期市場利率趨升,惟國內市場流動性
A scanned PDF gives status: "scanned-no-text-layer", chargedPages: 0 and a note: "No text layer found: this looks like a scanned or image-only PDF (or text drawn as outlines). OCR is not supported, so nothing was extracted and nothing was charged."
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
run-start | $0.002 | Once per run, and only if at least one page is converted. Put many PDFs into one run to spread it. |
page-converted | $0.0005 | Per page whose text layer was converted |
Free: scanned, image-only, blank and garbled pages, failed downloads (including unreachable domains), rejected files, duplicate URLs, and documents skipped because of your spending limit. If no page in the run is converted, the run costs nothing (no run fee). Duplicate URLs are removed before anything is downloaded: matching ignores #fragments (such as #page=2), tracking parameters (utm_*, fbclid, gclid and similar) and letter case in the domain; each duplicate gets a free row with status: "duplicate". The Actor respects Maximum cost per run (maxTotalChargeUsd): it processes only as many pages as fit, and never charges the same document twice if a run is restarted.
Example: one 10-page PDF costs $0.002 + 10 × $0.0005 = $0.007.
Scheduled change (from 2026-10-31 06:33 UTC): pages 21 and later in each document will be charged as a new page-extra event at $0.00015 per page instead of $0.0005. run-start ($0.002) and page-converted for pages 1–20 ($0.0005) stay the same. Example after the change: one 50-page PDF = $0.002 + 20 × $0.0005 + 30 × $0.00015 = $0.0165 (today: $0.027).
API examples (verified)
curl
curl -s -X POST "https://api.apify.com/v2/acts/raspberry_rondel~pdf-to-markdown-converter/run-sync-get-dataset-items?fields=url,status,pageCount,pagesConverted,chargedPages,content" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls": ["https://www.cbc.gov.tw/dl-227271-2a727785de8e4e12ab78cdf02a1fbc27.html"], "outputFormat": "markdown"}'
Python (apify-client v3)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("raspberry_rondel/pdf-to-markdown-converter").call(run_input={"urls": ["https://arxiv.org/pdf/1512.03385"], "outputFormat": "markdown", "maxPagesPerDocument": 2})for item in client.dataset(run.default_dataset_id).iterate_items():print(item["status"], item["pageCount"], item["pagesConverted"], item["chargedPages"])print(item["content"][:300])
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('raspberry_rondel/pdf-to-markdown-converter').call({urls: ['https://www.ey.gov.tw/File/9F4CCF9F9B2EFF2C?A=C', 'https://www.cbc.gov.tw/dl-227271-2a727785de8e4e12ab78cdf02a1fbc27.html'],outputFormat: 'text',});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) console.log(item.status, item.pageCount, item.chargedPages, (item.notes ?? [''])[0].slice(0, 80), item.content.slice(0, 80));
Tips
- For RAG, set
includePages: trueand chunk per page so you can cite page numbers. The full document is also incontentFile. - Big batches: documents are converted one after another, at about 0.4–0.6 s per page with the default 2 GB memory. In an internal stress test (2026-10-17), the 492-page NIST SP 800-53r5 took 277 s. 50 NIST PDFs with 4,868 converted pages took 2,075 s, with peak memory under 160 MB. The default run timeout is 3 hours, enough for about 20,000 pages. For more, split the list across runs.
- Check
statusandnotesbefore indexing:partialmeans some pages had no text layer (often charts or blank pages).
More tools from this developer
- Google Trends Bulk Compare – Many Keywords, One Scale
- Google Autocomplete Keyword Expander – A-Z & Questions
- Audio & Video File Transcriber: turn spoken audio into text, SRT or VTT.
Open-source components: pdfplumber and pdfminer.six (MIT). No GPL/AGPL code is used.