Supported Formats & Known Limitations
What each of Formshift's three conversion types actually supports today, and where the current gaps are — updated as the product changes, not a permanent list.
Markdown → PDF
Standard Markdown (headings, bold/italic, lists, quotes, tables) | ✓ |
Code blocks with syntax highlighting | ✓ |
Mermaid diagrams | ✓ |
Images by URL Automatically scaled to fit the page width. | ✓ |
Images embedded as Base64 Automatically scaled to fit the page width — the dashboard has a built-in local-image-to-Base64 tool. | ✓ |
Images by local file path (e.g. ./diagram.png) Use a URL or Base64 instead. | ✕ |
Any format → Markdown
Word (.docx) | ✓ |
PDF, text-based Scanned or image-only PDFs aren't supported — see below. | ✓ |
Excel (.xlsx / .xls) Supported in principle, not yet verified against a real file. | ~ |
PowerPoint (.pptx) Supported in principle, not yet verified against a real file. | ~ |
PowerPoint, legacy binary format (.ppt) Save as .pptx first. | ✕ |
HTML (.html / .htm) | ✓ |
Plain text / CSV / JSON / XML CSV becomes a Markdown table; the others keep their original content. | ✓ |
ZIP archives Each file inside is converted and combined into one result. | ✓ |
Images embedded inside a document Kept inline for Word/PowerPoint sources. PDF sources are the exception — see the Q&A below. | ~ |
Standalone image files (PNG, JPG, etc.) See the Q&A below. | ✕ |
Outlook email (.msg) | ✕ |
Audio files | ✕ |
Any format → PDF
Word (.docx) | ✓ |
PDF, text-based Scanned or image-only PDFs aren't supported — see below. | ✓ |
Excel (.xlsx / .xls) Supported in principle, not yet verified against a real file. | ~ |
PowerPoint (.pptx) Supported in principle, not yet verified against a real file. | ~ |
PowerPoint, legacy binary format (.ppt) Save as .pptx first. | ✕ |
HTML (.html / .htm) | ✓ |
Plain text / CSV / JSON / XML CSV becomes a table; the others keep their original content. | ✓ |
ZIP archives Each file inside is converted and combined into one result. | ✓ |
Images embedded inside a document Kept inline for Word/PowerPoint sources. PDF sources are the exception — see the Q&A below. | ~ |
Standalone image files (PNG, JPG, etc.) Produces a near-empty PDF — see the Q&A below. | ✕ |
Outlook email (.msg) | ✕ |
Audio files | ✕ |
Image → Markdown (OCR)
English | ✓ |
Traditional Chinese | ✓ |
Japanese | ✓ |
Auto-detect (mixed languages) Runs all three languages together — noticeably lower accuracy than picking the right single language. | ~ |
Other languages (Simplified Chinese, Korean, etc.) Not yet supported. | ✕ |
PDF → Markdown (OCR)
Scanned or image-only PDF Uses a different engine (MinerU) than Image → Markdown — reconstructs headings, tables, and reading order where possible, not just raw text. | ✓ |
PDF that already has selectable text Use Any format → Markdown instead — it's faster, cheaper, and already handles this case. | ✕ |
Questions
Why doesn't uploading a photo or screenshot to Any format → Markdown/PDF produce any text?
Any format → Markdown/PDF can't read text out of a standalone image file — there's no OCR built into that conversion type. The conversion won't show an error, but the result will be empty. Use the separate Image → Markdown (OCR) conversion type instead — it's built specifically for this. This is different from an image that's already embedded inside a document (like a photo pasted into a Word file) — those are preserved correctly by Any format → Markdown/PDF, with one exception: PDF sources — see the next question.
How accurate is Image → Markdown (OCR), and which languages does it support?
It currently supports English, Traditional Chinese, and Japanese, each as a selectable language mode — pick the one that matches your image for the best accuracy. An "auto-detect" mode is available for mixed content, but it runs all three languages at once and is noticeably less accurate than picking the right single language. Accuracy depends heavily on how "clean" the image's layout is, not just its resolution: a scanned document or a screenshot of plain text works very well. Screenshots of app or website interfaces — with icons, colored buttons/badges, or embedded photos mixed in with the text — are a much harder case; text sitting right next to an icon can be dropped entirely, and icons themselves sometimes get misread as garbled characters. If a result looks like gibberish, picking a more specific language usually won't fix it if the source is this kind of busy UI screenshot. Every image is automatically enhanced before recognition (contrast adjustment and upscaling for small images), which helps in many cases, and results the system isn't confident about are flagged with a warning in your history rather than presented as reliable — but for genuinely busy UI screenshots, treat the result as a rough draft, not a guarantee. There's also an "Accurate" engine option (4 credits, paid credits only) built specifically for that busy-UI-screenshot case — it handles text next to icons/badges much better and can correctly separate embedded photos from text, but it has no automatic confidence check (so a bad result won't be flagged the way the default engine's is) and can occasionally miss small text elements. No language selection with this engine.
Why doesn't a scanned PDF convert properly with Any format → Markdown/PDF?
If a PDF is made of scanned pages or images with no selectable text layer, Any format → Markdown/PDF has no text recognition (OCR) to pull content out of it — the result will be empty or incomplete for those pages. Use the separate PDF → Markdown (OCR) conversion type instead — it's built specifically for this case.
Why don't images embedded in a PDF appear in my Any format → Markdown/PDF output?
This is a real limitation of the underlying conversion library, not a bug. Word and PowerPoint sources keep their embedded images (as inline Base64), but PDF sources never do, regardless of how the images were embedded in the original file — the library's PDF converter only extracts text and tables, with no image-extraction step at all. There's currently no workaround for this within Any format → Markdown/PDF. If your PDF is scanned or image-only, PDF → Markdown (OCR) is a different tool solving a different problem — it re-runs OCR on the whole page rather than preserving a photo or illustration that sits alongside real text.
How does PDF → Markdown (OCR) work, and how accurate is it?
It uses a different engine (MinerU) than Image → Markdown (OCR)'s Tesseract — one built specifically for parsing document layouts, so it aims to reconstruct headings, tables, and correct reading order (including multi-column pages), not just extract flat text. It costs more credits than other conversion types because it uses a heavier engine than the rest of the product. This is for scanned/image-only PDFs specifically — if your PDF already has selectable text, use Any format → Markdown instead (faster and cheaper). As with Image → Markdown (OCR), a result the system isn't confident about may still contain mistakes; treat the output as a strong starting draft, especially for unusually complex layouts, and double-check anything important.
What's the maximum file size I can upload?
Any format → Markdown, Any format → PDF, Image → Markdown (OCR), and PDF → Markdown (OCR) all share the same limit: 500MB per file. It's enforced right at the upload step — an oversized file is rejected before any credit is charged, and the dashboard warns you as soon as you pick a file that's too big. Markdown → PDF works differently: there's no file upload, just pasted or typed text (optionally prefilled from a .md file), and the practical limit there is about 20MB of content, including any Base64-embedded images.
Can I convert an old .ppt PowerPoint file?
Only the modern .pptx format is currently supported. The legacy binary .ppt format hasn't been verified — save the file as .pptx in PowerPoint first, then upload that.
Why doesn't a local image path (like ./diagram.png) show up in my Markdown → PDF output?
Markdown → PDF only receives the text you paste or write — it has no access to files on your computer. Use an image URL instead, or convert the image to Base64 and paste that in directly (the dashboard has a built-in tool for this).