[HN Gopher] Show HN: TinyPDF - 3kb pdf library (70x smaller than...
___________________________________________________________________
Show HN: TinyPDF - 3kb pdf library (70x smaller than jsPDF)
I needed to generate invoices in a Node.js app. jsPDF is 229KB. I
only needed text, rectangles, lines, and JPEG images.
So I wrote tinypdf: <400 lines of TypeScript, zero dependencies,
3.3KB minified+gzipped. What it does: - Text
(Helvetica, colors, alignment) - Rectangles and lines -
JPEG images - Multiple pages, custom sizes What it
doesn't do: - Custom fonts, PNG/SVG, forms, encryption, HTML-
to-PDF That's it. The 95% use case for invoices,
receipts, reports, tickets, and labels. GitHub:
https://github.com/Lulzx/tinypdf npm: npm install tinypdf
Author : lulzx
Score : 227 points
Date : 2025-12-18 18:59 UTC (2 days ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| IntelliAvatar wrote:
| 3KB is wild. What features did you intentionally leave out to get
| this small?
| wonger_ wrote:
| Not the author, but generating PDFs is much, much simpler than
| parsing PDFs
| lysace wrote:
| Support for more than 7-bit ASCII characters. :)
| teaearlgraycold wrote:
| It only supports Helvetica!
| hu3 wrote:
| utf-8
| anilgulecha wrote:
| Great exercize, but for most use cases - people will continue
| reaching for jsPDF.
|
| I think if you have a markdown->PDF function included, where I
| can send in markdown and get PDF, that would solve quite many
| needs, and would be useful.
| lulzx wrote:
| I have added it!
| nebezb wrote:
| Wow you're not kidding. That was fast.
|
| https://github.com/Lulzx/tinypdf/commit/961e6b602f19e125f210.
| ..
| pylotlight wrote:
| HTML -> PDF was also a use case I've used previously FYI
| croisillon wrote:
| is it related to one of the other 10 products called TinyPDF?
| esafak wrote:
| Yes, obviously: it's a tiny PDF library.
| andai wrote:
| Back in the day I needed PDF export for some client thing. I
| can't remember if I was using pdfjs or jspdf. I do however
| remember that it was many thousands of lines of code, and yet, I
| had to lay out the lines of text on the page manually.
|
| My page layout code was like 50 lines of code. And I remember
| thinking... OK they already wrote 8,000 lines of code... They
| couldn't have added 50 more?!
|
| 400 lines though. Respect. I will take a proper look at this when
| I recover from burnout :)
| wg0 wrote:
| So essentially - it only works with Latin script? Because without
| fonts, every other script is NOT going to render.
| jbaiter wrote:
| Agree, the lack of support for TTF fonts is a bummer for most
| non-english use cases:-/
| RodgerTheGreat wrote:
| It's definitely _far_ easier to emit a controlled, useful subset
| of PDF than it is to parse PDF documents. I wrote a small PDF
| library for the Decker ecosystem that just focuses on bitmaps and
| page layout; roughly 4kb and 135 LoC.
|
| docs/demos: https://beyondloom.com/decker/pdf.html
|
| browsable source:
| https://github.com/JohnEarnest/Decker/blob/main/examples/dec...
| kuschkufan wrote:
| This decker stuff is pretty nifty too
| user3939382 wrote:
| I'm working on one rn. It takes arbitrary PDFs and builds
| composable dynamic pandoc pipelines to match the source byte
| for byte output. It's very very complex. But if I can get it
| finished it will fuck over Adobe so worth it.
| culi wrote:
| While not quite as small as 3kb, I recently found this incredible
| library called html-to-image that's only 300kb. It clones
| whatever subtree of your document you want to a <foreignObject>
| inside an svg which then allows it to output canvas, png, svg,
| pdf, blob, jpeg, etc. Even more impressively is that it handles
| custom fonts, pseudo-elements, computed styles and more.
|
| https://github.com/bubkoo/html-to-image
|
| It's probably the most impressive and seamless experience I've
| had with converting HTML to pdfs/images so I just wanted to sing
| its praises here
| normie3000 wrote:
| It does sound very cool, but I don't think it exports to PDF:
| https://github.com/bubkoo/html-to-image/issues/327
| culi wrote:
| Oh my, you're right. I've actually only tried it for
| exporting to images. Sorry for the misleading comment!
| layer8 wrote:
| Only supports ASCII characters, which is part of the trick here.
| As soon as you need more Unicode (even just typographic quote
| characters and such), you'll need significantly more logic. Also
| no bold, italics, etc.
| raybb wrote:
| Was Typst falling short in any particular area that made you not
| want to use it? (If it was on your radar at all). I think it
| would work for your use case and could also run client side if
| needed.
|
| Here's the TS library: https://github.com/Myriad-Dreamin/typst.ts
| winterec wrote:
| Great work thanks for sharing. I've been looking for something
| like this for generating invoice PDFs without bloat.
| copypaper wrote:
| Nice work! I'm curious though, what was your use case for needing
| a smaller library? Since you're running this on a server, what
| difference does an extra 226KB make?
| lulzx wrote:
| on cloudflare workers, the bundle limit makes 226KB massive.
| kentonv wrote:
| FWIW, the limit these days is 10MB (after compression).
|
| https://developers.cloudflare.com/workers/platform/limits/
|
| That said, thank you for fighting library bloat! Small
| libraries tend to perform better (not just on Workers but in
| general).
| userbinator wrote:
| I still have a tiny DOS binary (x86 Asm) that I wrote decades ago
| for turning plaintext ASCII files into PDFs, for those annoying
| use-cases where the former isn't accepted but the latter is. It's
| only a few hundred bytes, with the majority being data to be
| copied verbatim into the output file.
| dzrmb wrote:
| I actually was battling jsPDF the other day so definitely need to
| give this a try, thanks!
| nanis wrote:
| HTML + CSS works great for this kind of thing. Once you get the
| print scope correct, you really never need to think about it
| again.
| ErroneousBosh wrote:
| Heh, no stars when I first looked and though "hey I'll star this"
| and now 300 ;-)
| alexpadula wrote:
| Well ain't that a useful 400 lines of code eh! Good work
___________________________________________________________________
(page generated 2025-12-20 23:02 UTC)