How to convert a markdown blog post to a printable pdf
- Step 1Get the post's raw Markdown — Copy the post body from your CMS, Notion, or repo and save it as a
.mdor.txtfile. Strip front-matter (the---YAML block at the top) if you don't want it printed as text. - Step 2Open the converter and drop the file — Load the Markdown to PDF converter and drop the post file. Accepted:
.md,.markdown,.txt. It converts locally in pdf-lib. - Step 3Let it auto-convert — There's no options screen; the post converts as soon as you add the file. Headings become larger and bold; the body is 10 pt.
- Step 4Wrap long lines and check images — Lines over 100 characters are cut. If paragraphs are one long line, add breaks first. Remember the hero image and inline screenshots won't render — they print as text.
- Step 5If you want it on-brand, switch to HTML — For a designed lead magnet with your fonts, colours, images, and a footer URL, render the post to HTML with your stylesheet and use HTML to PDF instead.
- Step 6Download and distribute — Download the PDF (named
<filename>.markdown-to-pdf.pdf) and attach it to a newsletter, or host it for a gated download. To gate it behind an email opt-in, use your email platform's form-triggered download link.
Blog elements and what survives conversion
Posts mix prose, images, code, and links — here's exactly what this renderer keeps versus what needs the HTML path.
| Blog element | In the PDF | For a polished version |
|---|---|---|
# Post Title | 16 pt bold line | Works here |
## Section | 14 pt bold line | Works here |
| Body paragraphs | 10 pt, truncated at 100 chars/line | Wrap lines short; works here |
| Hero image / screenshots | Literal ![…] text | HTML to PDF, or Image to PDF |
| Code snippet | Plain text, no highlighting | HTML to PDF |
Inline link [read](url) | Literal [read](url) text | HTML to PDF for clickable links |
| Brand fonts / colours | Always Helvetica, black | HTML to PDF with your CSS |
| Footer with your URL | Not added | HTML to PDF, or PDF Page Numbers for a footer |
Blog conversion contract
What you can count on for a repurposed-post PDF.
| Property | Value |
|---|---|
| Input | .md, .markdown, .txt |
| Output | Single PDF, US Letter (612×792 pt), fixed |
| Styling control | None — no CSS, no theme, no fonts input |
| Images | Not embedded (printed as text) |
| Footer / header | Not added by this tool |
| Free size limit | 2 MB (Pro removes it) |
| Line wrap | None — truncated at ~100 chars |
| Privacy | Client-side; drafts never uploaded |
Cookbook
Blog snippets and the PDF they produce — so you can decide if the plain version is enough or if you need the HTML path.
A prose-heavy post converts cleanly
Long-form writing with headings is exactly what this tool does well. Emphasis markers vanish, leaving readable text.
post.md: # Why we rewrote our API ## The breaking point Latency spiked and our **p99** climbed past 2s during peak. ## The fix We sharded the queue and moved hot paths to a worker pool. PDF output: Why we rewrote our API ← 16 pt bold The breaking point ← 14 pt bold Latency spiked and our p99 climbed past 2s during peak. The fix ← 14 pt bold We sharded the queue and moved hot paths to a worker pool.
The hero image doesn't appear
A blog post's lead image is central to its look but won't embed — the Markdown prints as text.
post.md: # 5 lessons from launch  It was a wild week. PDF output: 5 lessons from launch ← 16 pt bold  ← literal text It was a wild week. Want the image? Use HTML to PDF (or Image to PDF for the picture).
Front-matter prints as text unless removed
CMS exports often start with a YAML front-matter block. The tool prints it verbatim — strip it first for a clean cover.
post.md: --- title: My Post date: 2026-06-01 tags: [eng, infra] --- # My Post PDF output: --- ← literal title: My Post ← literal date: 2026-06-01 ← literal tags: [eng, infra] ← literal --- ← literal My Post ← 16 pt bold Fix: delete the --- block before converting.
A code snippet loses its highlighting
Technical posts with code will render the snippet as plain text. Plan to use the HTML path for code-heavy articles.
post.md: ## The query ```sql SELECT * FROM users WHERE active = true; ``` PDF output: The query ← 14 pt bold ```sql ← literal SELECT * FROM users WHERE active = true; ``` ← literal For a real code box: HTML to PDF.
No footer URL — add one downstream if needed
There is no footer setting. If you want your site URL on each page of a print copy, do it as a separate step.
Goal: 'blog.example.com' on every page footer. This tool: produces the body PDF only — no footer. Workaround options: • Add page numbers / a footer line via PDF Page Numbers • Or render the post in HTML with a CSS @page footer, then HTML to PDF
Edge cases and what actually happens
Your blog's design isn't applied
Plain onlyThere is no CSS or theme input — the PDF is always Helvetica, black text, fixed sizes. It will not look like your site. For an on-brand lead magnet, render the post to HTML with your stylesheet and use HTML to PDF.
Hero image and screenshots don't embed
Not embeddedImage syntax prints as literal text; the lead image and inline screenshots won't appear. For a visual post, use HTML to PDF (images inlined), or assemble pictures separately with Image to PDF.
Front-matter is printed verbatim
Literal textA YAML front-matter block (--- title: … ---) at the top of a CMS export is printed as text, including the dashes and keys. Delete the front-matter block before converting for a clean opening.
Code snippets aren't highlighted
By designFenced code in technical posts renders as plain 10 pt text — no monospace, box, or colour. Code-heavy articles look raw; the HTML-to-PDF path renders <pre><code> properly.
Links aren't clickable
Plain textInline links print as their literal [text](url) Markdown and aren't clickable in the PDF. For a lead magnet where readers click through, use HTML to PDF so links remain live, or spell out the URL in the source.
No footer or header with your URL
Not addedThe tool adds no running footer or header. To put your site URL on each page, add a footer line via PDF Page Numbers afterwards, or build the post in HTML with a CSS @page footer and use HTML to PDF.
Long paragraph lines are truncated
TruncatedEach line is cut at 100 characters with no wrap. Posts often have long sentences on one line — wrap them in your editor before converting so nothing is lost.
Emoji in headlines may drop
May dropHelvetica's WinAnsi set has no emoji, so a ✨ in a headline can fail to draw. Keep headline characters in the Latin range, or use the HTML path with an emoji-capable font.
Fixed US Letter page size
FixedOutput is 612×792 pt (US Letter) with no option to change it. For an A4 reading copy, render via HTML (set the page in CSS) or resize the PDF afterwards.
Draft near the 2 MB free cap
2 MB free limitFree conversions cap at 2 MB. A text post is tiny, but a draft with base64-embedded images could approach it — remove embedded data, or upgrade to Pro. Pages are added automatically.
Frequently asked questions
Can I add a footer with my website URL to the PDF?
Not within this tool — it has no footer or header settings and produces only the body. To add a site URL on every page, run the result through PDF Page Numbers (which can place a line in a page corner), or render the post in HTML with a CSS @page footer and convert with HTML to PDF.
Will the PDF look like my blog's design?
No. There is no CSS or theme input; the PDF is always Helvetica in black on US Letter. It is a plain reading copy, not a branded asset. For an on-brand lead magnet, render the post to HTML with your stylesheet (fonts, colours, hero image) and use HTML to PDF.
Can I gate the PDF download behind an email opt-in?
Yes, but that part happens outside this tool. Convert the post to a PDF here, host the PDF on your server, and use your email platform's (Mailchimp, Kit/ConvertKit, etc.) form-triggered download link to gate access behind a signup.
Will my hero image and screenshots appear in the PDF?
No. Image syntax prints as literal text; pictures are not fetched or embedded. For a visual post, render it to HTML with the images inlined and use HTML to PDF, or place images on their own pages with Image to PDF.
Why is there a block of --- and key: value text at the top?
That's your YAML front-matter being printed verbatim. This tool doesn't parse front-matter — it treats it as ordinary text. Delete the --- … --- block at the top of the file before converting for a clean opening page.
Will code snippets in a technical post be highlighted?
No. Fenced code blocks render as plain 10 pt text with no monospace font, box, or syntax colour. For a code-heavy article, render to HTML and use HTML to PDF, which renders code blocks properly.
Are links in the post clickable in the PDF?
No — links print as their literal [text](url) Markdown and aren't interactive. If readers need to click through (e.g. a CTA in a lead magnet), use the HTML-to-PDF path so anchors stay live, or write out the full URL in the source text.
Is my unpublished draft uploaded?
No. Conversion runs entirely in your browser using pdf-lib; the draft never reaches a server. Only an anonymous run counter is recorded when you're signed in, and you can opt out — safe for embargoed or pre-publish content.
Can I paste the post text instead of uploading a file?
No. The tool reads a dropped or browsed file only and has no paste box. Save the post as a .md, .markdown, or .txt file and drop it in; it converts automatically.
What page size will the reading copy be?
US Letter (612×792 pt), fixed — there is no A4 or custom option. For an A4 reading copy, render the post via HTML and set the page in CSS, or resize the resulting PDF in a dedicated tool.
Why did a long sentence get cut off?
Lines are truncated at 100 characters with no word-wrap. Blog paragraphs are often one long line. Add line breaks in your editor (or use a 'reflow paragraph' command) so each line is shorter before converting.
What is the downloaded file called?
It is named after your source file with a .markdown-to-pdf.pdf suffix — e.g. my-post.markdown-to-pdf.pdf. Rename it before sending it to subscribers.
Privacy first
All PDF processing runs locally in your browser using PDF-lib and pdf.js. No file is ever uploaded — only metadata counters are saved for signed-in dashboard stats.