LINUX.ORG.RU

PlutoBook

 , , , ,


3

2

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;
}
★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 3)

А Pluto она потому, что её начал писать автор PlutoVG 0.0.10 и LunaSVG 3.1.0, хотя они в ней и не используются.

dataman ★★★★★
() автор топика
Ответ на: комментарий от x22

Вряд ли, она только для рендеринга.
Вот в RSS Guard будет использоваться https://github.com/litehtml/litehtml.

А вот https://github.com/litehtml/litebrowser-linux я не пробовал собирать.

dataman ★★★★★
() автор топика
Последнее исправление: dataman (всего исправлений: 1)

Наличие опакеченой консольной утилиты будет кстати. Понятно, что можно самому наваять …

Не увидел только, можно ли отдельно файл CSS подавать:

./html2pdf https://www.linux.org.ru main.css lor.pdf
TechnoMag ★★★
()
Последнее исправление: TechnoMag (всего исправлений: 1)
Ответ на: комментарий от TechnoMag

можно ли отдельно файл CSS подавать

Нет, только в виде строки:

Usage:
  html2pdf <input> <output> [<style>]

Arguments:
  input     URL or filename of the HTML input
  output    Path to the output PDF file
  style     Optional CSS style string to apply (e.g., "@page { size: A4; }")
dataman ★★★★★
() автор топика
Ответ на: комментарий от x22

От создателя CUPS, PAPPL и кучи других проектов – https://github.com/michaelrsweet/htmldoc:

HTMLDOC is a program that reads HTML and Markdown source files or web pages and generates corresponding EPUB, HTML, PostScript, or PDF files with an optional table of contents.

dataman ★★★★★
() автор топика

Мама, я в телевизоре! :-Р

zabbal ★★★★☆
()
Ответ на: комментарий от dataman

А вот https://github.com/litehtml/litebrowser-linux я не пробовал собирать.

Пару лет назад собирал и запускал в минте. Поскольку там нет js, некоторые сайты показывались не полностью. Из существенных неудобств – большие страницы скролятся рывками.

u-235
()

А вот по символу мягкого переноса она просто разрывает слова, не вставляя дефис. Непорядок.

MrCookie ★★★★
()

...собственный движок рендеринга...

Просто праздник жизни какой-то!

sparkie ★★★★★
()

Из консоли можно сохранять html в pdf браузерами прямо с сайта не сохраняя куда-либо страничку:

google-chrome --headless --disable-gpu --print-to-pdf=output.pdf https://example.com

И вангую выглядеть оно будет благообразнее. Как пример https://wdfiles.ru/2a4U3

Ygor ★★★★★
()

С обвязками к js было бы интереснее, так сейчас применение скорее для прикладных приложений

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от dataman

Не все готовы встраивать Хром в свою программу.

Скорее ставить в свою систему. Оно же внешнее дергается, как в селениуме.

Zhbert ★★★★★
()

Ну и я согласен со всеми вышеотписавшимися, что без рендеринга JS оно много где работать просто не будет, или будет выдавать совершенно не тот результат, которого ты от неё ждешь.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Скорее ставить в свою систему.

И это тоже. Я выше написал, что автор RSS Guard работает над заменой Qt WebEngine на litehtml.
Что он будет делать с движком JS, пока не знаю. :)

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

Я последнее время наблюдаю довольно печальную картину запихивания жабоскрипта вообще везде, и это уже чуть ли не мейнстрим. Вот даже у нас → дока генерится джекилом в статику, но много где есть самописные куски на жс, которые подменяют какие-то части после загрузки страницы, переключают вкладки и т.д. И оно всё, такая доке отрендерится таким вот плутой уже неправильно.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

что без рендеринга JS оно много где работать просто не будет

Там есть и другой пример, invoice.cpp:

#include "plutobook.hpp"

int main()
{
    plutobook::Book book(plutobook::PageSize::A4);
    book.loadUrl("invoice.html");
    book.writeToPdf("invoice.pdf");
    book.writeToPng("invoice.png");
    return 0;
}

будет выдавать совершенно не тот результат, которого ты от неё ждешь.

Результат хороший. :)

dataman ★★★★★
() автор топика

Зачем? Никто ведь не будет использовать, это всё равно не сможет заменить ни pdf, ни офисных форматов.

kirill_rrr ★★★★★
()

Огонь! Как раз такая нужна!

pihter ★★★★★
()
Ответ на: комментарий от kirill_rrr

Никто ведь не будет использовать

Не надо говорить за всех

это всё равно не сможет заменить ни pdf, ни офисных форматов

Где говорится о такой замене?

u-235
()
Ответ на: комментарий от rumgot

Пока нет, а может и не будет.

dataman ★★★★★
() автор топика
Ответ на: комментарий от Belkrr

А какой сабсет html поддерживатеся?

Неизвестно. В истории коммитов тоже не нашёл.

dataman ★★★★★
() автор топика

Наконец-то rms сможет читать ЛОР по почте.

urxvt ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.