In my view, the best way forward always depends on what you already have experience with and what approach you take. There is no right or wrong here, everyone has to decide that for themselves based on their preferences.
Each approach has advantages and disadvantages. Some of them are:
Headless Browser:
Advantage:
- No large Libs necessary, therefore very memory saving
Disadvantage
- the desired browser must be installed on the computer/server
- rendering may differ for different browsers
Library:
Advantage:
- different libraries available
- for the popular libs there is a good documentation and code examples
Disadvantage
- When upgrading to a newer version, code usually needs to be adapted.
- When upgrading to a newer version, the result may look different.
In my projects I use a headless chrome browser. For this I found an easy to use api on Github, which uses the DevTools of Chrome.
It also includes a simple example how to print a page into a PDF.
For my purposes I have customized this example and write the HTML into a temporary file and then navigate to that file.
// Navigate to HTML-File
page.navigate(htmlTempFile.getAbsolutePath());
I can't say if this is the best way, but for me this was the easiest and most understandable way