[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)