# \[ANN\] New Package: PlutoBook.jl

**URL:** <https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641>\
**Category:** Package Announcements\
**Created:** [September 24, 2025, 10:38pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641 "2025-09-24T22:38:31Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![avik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/avik/32/17_2.png) [@avik](https://discourse.julialang.org/u/avik)\
**Post date:** [September 24, 2025, 10:38pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/1 "2025-09-24T22:38:32Z")

</div>

I’ve had a long (and possibly excessive) interest in how to generate PDF files programmatically. There aren’t too many options in this space – paged rendering is a pretty hard thing to do well. The state of the art methods today need either a full TeX distribution, or a full Chromium distribution, both of which are very large bundles. Especially if you are distributing your own software, many hundreds of megabytes of additional dependencies can often be a problem. We’ve certainly had issues with the size of our container images due to these dependencies.

So I was glad to see a new C++ project, [PlutoBook](https://github.com/plutoprint/plutobook), which converts html files into pdfs or pngs. (Or Cairo surfaces, for that matter). It implements its own purpose built html and css renderer. I liked what I saw, and have now wrapped it into a Julia package: PlutoBook.jl.

Julia Repo: [GitHub - aviks/PlutoBook.jl: Paged HTML Rendering Library](https://github.com/aviks/PlutoBook.jl)  
Documentation: [Home · PlutoBook.jl](https://docs.juliahub.com/General/PlutoBook/stable/)

Hopefully this will be of interest to a few other people as well. Feedback at the usual places much appreciated.

[PS: IMO the best method of generating high quality pdfs dynamically is a Java library, but that’s a conversation for some other time and place 😃]

---

<div class="post-metadata">

**Author:** ![raman\_kumar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raman_kumar/32/26782_2.png) [@raman\_kumar](https://discourse.julialang.org/u/raman_kumar)\
**Post date:** [September 24, 2025, 10:46pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/2 "2025-09-24T22:46:08Z")

</div>

Can it convert html files into **epub** format also? EPUB format works better in E-readers/ kindle etc.

---

<div class="post-metadata">

**Author:** ![avik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/avik/32/17_2.png) [@avik](https://discourse.julialang.org/u/avik)\
**Post date:** [September 24, 2025, 10:53pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/3 "2025-09-24T22:53:22Z")

</div>

Isn’t EPUB essentially just html (with images and css zipped up)?

In general, EPUB is a reflowable content, not paged content. There are quite a lot of tools that convert from markdown or html to epub. For use from within Julia, Pandoc.jl is [one option](https://pandoc.org/epub.html).

Plutobook.jl is for converting **from** html **to** png/pdf.

---

<div class="post-metadata">

**Author:** ![raman\_kumar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raman_kumar/32/26782_2.png) [@raman\_kumar](https://discourse.julialang.org/u/raman_kumar)\
**Post date:** [September 24, 2025, 10:56pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/4 "2025-09-24T22:56:10Z")

</div>

> [@avik](#):
>
> Isn’t EPUB essentially just html (with images and css zipped up)?

I could not get good EPUB file for latest Julia documentation.

> [@Documentation Formats - epub mobi pdf](https://discourse.julialang.org/t/documentation-formats-epub-mobi-pdf/7700/11):
>
> Why is not EPUB format of Julia documentation available on [official website](https://docs.julialang.org/en/v1/)? I am looking for EPUB format of Julia documentation. I have an E-Ink tablet so i would like to read Julia documentation on it. Is there any solution to it?

---

<div class="post-metadata">

**Author:** ![j-fu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/j-fu/32/11373_2.png) [@j-fu](https://discourse.julialang.org/u/j-fu)\
**Post date:** [September 24, 2025, 11:45pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/5 "2025-09-24T23:45:08Z")

</div>

Interesting. The name is quite bit puzzling, as one would expect this package to be able to generate well formatted pdfs from Pluto.jl files. But as the name comes from the plutobook C++ project, it appears to be legitimate. I think this should be explained in the readme (I contemplate a PR on this).  
Nevertheless, it is interesting how this can work together with Pluto.jl, I tried:

- html files directly generated by Pluto.jl end up in empty pages
- html files created with PlutoStaticHTML.jl appear to render well. LaTeX formulas are rendered just as raw LaTeX, the reason for this of course is that plutobook does not support javascript. However, the first todo item in the plutobook README is the addition of some lightweight javascript engine. If this would support KaTeX, we could get a reasonable workflow with Pluto.jl notebooks.

Will put this onto my watch list.

---

<div class="post-metadata">

**Author:** ![oschulz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oschulz/32/2998_2.png) [@oschulz](https://discourse.julialang.org/u/oschulz)\
**Post date:** [September 24, 2025, 11:51pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/6 "2025-09-24T23:51:20Z")

</div>

> [@avik](#):
>
> I’ve had a long (and possibly excessive) interest in how to generate PDF files programmatically. There aren’t too many options in this space – paged rendering is a pretty hard thing to do well.

The [Typstry.jl](https://github.com/jakobjpeters/Typstry.jl) Julia [Typst](https://github.com/typst/typst) wrapper probably deserves a mention here - much more lightweight than a LaTeX installation and high-quality rendering.

---

<div class="post-metadata">

**Author:** ![technocrat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/technocrat/32/220947_2.png) [@technocrat](https://discourse.julialang.org/u/technocrat)\
**Post date:** [September 25, 2025, 12:28am UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/7 "2025-09-25T00:28:11Z")

</div>

`Pandoc.jl` wraps the Swiss Army Knife of format converters.

---

<div class="post-metadata">

**Author:** ![TheCedarPrince](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/thecedarprince/32/17323_2.png) [@TheCedarPrince](https://discourse.julialang.org/u/TheCedarPrince)\
**Post date:** [September 25, 2025, 12:55am UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/8 "2025-09-25T00:55:23Z")

</div>

> [@avik](#):
>
> [PS: IMO the best method of generating high quality pdfs dynamically is a Java library, but that’s a conversation for some other time and place 😃]

But now I want to know what your thoughts are on this as someone also obsessed with dynamically preparing documents…

---

<div class="post-metadata">

**Author:** ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)\
**Post date:** [September 25, 2025, 1:44am UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/9 "2025-09-25T01:44:40Z")

</div>

Thanks a lot for this package!

I created two [issues](https://github.com/aviks/PlutoBook.jl/issues).

---

<div class="post-metadata">

**Author:** ![avik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/avik/32/17_2.png) [@avik](https://discourse.julialang.org/u/avik)\
**Post date:** [September 25, 2025, 9:48am UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/10 "2025-09-25T09:48:03Z")

</div>

> [quote=“j-fu, post:5, topic:132641”]  
> I think this should be explained in the readme (I contemplate a PR on this).  
> [/quote]

This **is** mentioned in a note at the end of the package readme.

> [@oschulz](#):
>
> The [Typstry.jl](https://github.com/jakobjpeters/Typstry.jl) Julia [Typst](https://github.com/typst/typst) wrapper probably deserves a mention here

Yes, indeed. There is also Tectonic.jl

> [@technocrat](#):
>
> `Pandoc.jl` wraps the Swiss Army Knife of format converters.

Indeed, Pandoc is an amazing piece of software, but natively it writes .tex files. You then need a TeX implementation to actually create the PDF. Pandoc can call it, but you need to install it separately. Admittedly, this probably gives you the best fidelity in creating documents.

---

<div class="post-metadata">

**Author:** ![oschulz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oschulz/32/2998_2.png) [@oschulz](https://discourse.julialang.org/u/oschulz)\
**Post date:** [September 25, 2025, 12:31pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/12 "2025-09-25T12:31:08Z")

</div>

> Yes, indeed. There is also [Tectonic.jl](https://juliaregistries.github.io/General/packages/redirect_to_repo/Tectonic)

Thanks, I didn’t know that one yet.

---

<div class="post-metadata">

**Author:** ![jules](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@jules](https://discourse.julialang.org/u/jules)\
**Post date:** [September 25, 2025, 8:17pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/13 "2025-09-25T20:17:26Z")

</div>

This could also be nice for visual reference tests of html content in CI, as it can render to png. You can always string compare html but you might make changes that are not supposed to change the visual output and this way you could ensure that

---

<div class="post-metadata">

**Author:** ![technocrat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/technocrat/32/220947_2.png) [@technocrat](https://discourse.julialang.org/u/technocrat)\
**Post date:** [September 25, 2025, 11:56pm UTC](https://discourse.julialang.org/t/ann-new-package-plutobook-jl/132641/14 "2025-09-25T23:56:28Z")

</div>

Yeah, full TeX is a monster. You can ameliorate with TinyTex, which provides the pdf engines without all the packages.
