PlutoBook – надёжная библиотека для парсинга и рендеринга HTML, написанная на C++20 и предназначенная для работы с постраничной информацией. Она принимает HTML или XML на вход, применяет таблицы стилей CSS и размещает элементы на одной или нескольких страницах, которые затем могут быть отображены как растровые изображения или документы PDF.
В PlutoBook реализован собственный движок рендеринга, не зависящий от таких движков, как Chromium, WebKit или Gecko.
Движок спроектирован как надежный, лёгкий и эффективный с точки зрения памяти, используя современные возможности C++, такие как std::pmr::monotonic_buffer_resource, для оптимизации производительности выделения памяти и минимизации её фрагментации.
На скриншотах – результат работы примера html2pdf.cpp:
$ ./html2pdf https://www.linux.org.ru lor.pdf
Пример использования:
#include <plutobook.hpp>
#include <cmath>
#include <algorithm>
int main()
{
// Create a document with A4 pages and no margins
plutobook::Book book(plutobook::PageSize::A4, plutobook::PageMargins::None);
// Load content from Wikipedia
book.loadUrl("https://en.wikipedia.org/wiki/Bjarne_Stroustrup");
// Convert page size to pixel dimensions
const plutobook::PageSize& pageSize = book.pageSize();
int pageWidth = std::ceil(pageSize.width() / plutobook::units::px);
int pageHeight = std::ceil(pageSize.height() / plutobook::units::px);
// Only render up to 3 pages
uint32_t pageCount = std::min(3u, book.pageCount());
// Create a canvas wide enough to hold all pages side by side
plutobook::ImageCanvas canvas(pageCount * pageWidth, pageHeight);
canvas.clearSurface(1, 1, 1, 1); // white background
// Loop through pages and render each onto the canvas
for(uint32_t pageIndex = 0; pageIndex < pageCount; ++pageIndex) {
canvas.saveState();
canvas.translate(pageIndex * pageWidth, 0); // shift canvas to next page slot
book.renderPage(canvas, pageIndex);
canvas.restoreState();
}
// Save the final image
canvas.writeToPng("Bjarne_Stroustrup_Pages.png");
return 0;
}











