10-K PDF to Markdown
Annual reports often reach you as PDFs: a printed 10-K, a glossy annual report, a filing saved from a browser. This converts them to Markdown with their headings and tables, ready for a prompt or an index.
If you have a ticker, you usually do not need a PDF at all. Companies file their 10-Ks on EDGAR as HTML, and filings.tools splits those into items, Risk Factors and MD&A included, with a free API.
A real example
The SEC's own Form 10-K (general instructions and form, a public domain US government document), around Item 1A, exactly as returned:
SEC Form 10-K, general instructions and form, U.S. Securities and Exchange Commission.
Public domain: A work of the U.S. Government (17 U.S.C. 105). SEC site policy: information on sec.gov "is considered public information and may be copied or further distributed by users of the web site without the SEC's permission." Source.
19 pages, 1 table found, 0 scanned, 41,263 characters of Markdown. Converted by the service's own converter (parser 0.1.0, pymupdf4llm 1.28.2) when this page was built, in 1.14 s on the build machine.
# **Item 1A. Risk Factors.** Set forth, under the caption “Risk Factors,” where appropriate, the risk factors described in Item 105 of Regulation S-K (§ 229.105 of this chapter) applicable to the registrant. Provide any discussion of risk factors in plain English in accordance with Rule 421(d) of the Securities Act of 1933 (§ 230.421(d) of this chapter). Smaller reporting companies are not required to provide the information required by this item. ## If the registrant is an accelerated filer or a large accelerated filer, as defined in Rule 12b-2 of the Exchange Act (§ 240.12b-2 of this chapter), or is a well-known seasoned issuer as defined in Rule 405 of the Securities Act (§ 230.405 of this chapter) and has received written comments from the Commission staff regarding its periodic or current reports under the Act not less than 180 days before the end of its fiscal year to which the annual report relates, and such comments remain unresolved, disclose the substance of any such unresolved comments that the registrant believes are material. Such disclosure may provide other information including the position of the registrant with respect to any such comment. # **Item 1C. Cybersecurity.** Furnish the information required by Item 106 of Regulation S-K (§ 229.106 of this chapter).
Nothing between the first and last line shown has been edited.
This document on the benchmark
| Engine | Speed vs pdfmd | Headings kept |
|---|---|---|
| pdfmd.dev (pymupdf4llm) | 100% | 95.1% |
| Marker | 2% | 87.8% |
| Docling | 16% | 97.6% |
| Plain PyMuPDF text | 1,923% | 0.0% |
One machine, each engine's defaults. Speed is this document's conversion rate as a share of pdfmd's, from the median of three timed runs. Table-cell recall counts table values found in the right row and order; it does not check which column a value landed in. Method, all six documents and where we lose.
curl
curl -X POST https://pdfmd.dev/api/v1/convert \
-H "content-type: application/json" \
-d '{"url": "https://www.sec.gov/files/form10-k.pdf"}'
# An annual report PDF you have
curl -X POST https://pdfmd.dev/api/v1/convert \
-F "file=@annual-report-2025.pdf"
# With an API key, add: -H "x-api-key: $PDFMD_API_KEY"Python
import re
import requests
doc = requests.post(
"https://pdfmd.dev/api/v1/convert",
json={"url": "https://www.sec.gov/files/form10-k.pdf"},
timeout=180,
).json()
# Find the Item headings the converter kept.
items = re.findall(r"^#+ \**(Item \d+[A-C]?\.[^*\n]*)", doc["markdown"], flags=re.M)
print(items)Full reference: API docs. Limits and keys: pricing.
Limitations
- Item structure is not detected: headings come from the PDF's font sizes, so an Item can be a # or a ## heading, or plain bold text, depending on how the PDF was typeset.
- In the example, the heading "Item 1B. Unresolved Staff Comments" came back as an empty "##" line; its text is there but its title is not.
- A PDF has no XBRL, so there are no tagged financial facts. For those, use the filing on EDGAR.
- Glossy annual reports with text set over images or in many columns convert less cleanly than a plain 10-K.