Рецепты PostgreSQL: преобразование из HTML и URL в PDF и PS

  • Tutorial
Для приготовления преобразования из HTML и URL в PDF и PS нам понадобится сам postgres, генератор htmldoc и расширение pg_htmldoc. (Я дал ссылки на свои форки, т.к. делал некоторые изменения, которые пока не удалось пропихнуть в оригинальный репозитории. Можно также воспользоваться готовым образом.)

Для начала устанавливаем расширения командой
CREATE EXTENSION pg_htmldoc

Для преобразования из HTML и URL в PDF и PS используем команды

    SELECT file2pdf('file.html', 'file.pdf'); -- преобразуем FILE в PDF и сохраняем результат в файл
    SELECT file2ps('file.html', 'file.pdf'); -- преобразуем FILE в PS и сохраняем результат в файл
    SELECT file2pdf(ARRAY['file1.html', 'file2.html'], 'file.pdf'); -- преобразуем несколько FILE в PDF и сохраняем результат в файл
    SELECT file2ps(ARRAY['file1.html', 'file2.html'], 'file.pdf'); -- преобразуем несколько FILE в PS и сохраняем результат в файл
    SELECT html2pdf('Здравствуй, мир!', 'file.pdf'); -- преобразуем HTML в PDF и сохраняем результат в файл
    SELECT html2ps('Здравствуй, мир!', 'file.pdf'); -- преобразуем HTML в PS и сохраняем результат в файл
    SELECT html2pdf(ARRAY['Здравствуй, мир!', 'До свидания, мир!'], 'file.pdf'); -- преобразуем несколько HTML в PDF и сохраняем результат в файл
    SELECT html2ps(ARRAY['Здравствуй, мир!', 'До свидания, мир!'], 'file.pdf'); -- преобразуем несколько HTML в PS и сохраняем результат в файл
    SELECT url2pdf('https://google.com', 'file.pdf'); -- преобразуем URL в PDF и сохраняем результат в файл
    SELECT url2ps('https://google.com', 'file.pdf'); -- преобразуем URL в PS и сохраняем результат в файл
    SELECT url2pdf(ARRAY['https://google.com', 'https://google.ru'], 'file.pdf'); -- преобразуем несколько URL в PDF и сохраняем результат в файл
    SELECT url2ps(ARRAY['https://google.com', 'https://google.ru'], 'file.pdf'); -- преобразуем несколько URL в PS и сохраняем результат в файл

Также, результат генерации можно отправлять на почту с помощью pg_curl так
CREATE OR REPLACE FUNCTION send(url TEXT, username TEXT, password TEXT, subject TEXT, "from" TEXT, "to" TEXT[], data TEXT, type TEXT) RETURNS TEXT LANGUAGE SQL AS $BODY$
WITH s AS (SELECT
    pg_curl_easy_reset(), -- обнуляем (на всякий случай)
    pg_curl_easy_setopt('CURLOPT_URL', url), -- задаём адрес запроса
    pg_curl_easy_setopt('CURLOPT_USERNAME', username), -- задаём логин
    pg_curl_easy_setopt('CURLOPT_PASSWORD', password), -- задаём пароль
    pg_curl_recipient_append("to"), -- задаём получателей
    pg_curl_header_append('Subject', subject), -- задаём тему
    pg_curl_header_append('From', "from"), -- задаём отправителя
    pg_curl_header_append('To', "to"), -- задаём получателей
    pg_curl_mime_data(data, type:=type), -- задаём тело
    pg_curl_mime_data(file2pdf('file.html'), file:='=?utf-8?B?'||encode('Из FILE в PDF.pdf', 'base64')||'?=', type:='application/pdf', code:='base64'), -- задаём вложение из FILE в PDF
    pg_curl_mime_data(file2ps('file.html'), file:='=?utf-8?B?'||encode('Из FILE в PS.ps', 'base64')||'?=', type:='application/ps', code:='base64'), -- задаём вложение из FILE в PS
    pg_curl_mime_data(file2pdf(ARRAY['file1.html', 'file2.html']), file:='=?utf-8?B?'||encode('Из нескольких FILE в PDF.pdf', 'base64')||'?=', type:='application/pdf', code:='base64'), -- задаём вложение из нескольких FILE в PDF
    pg_curl_mime_data(file2ps(ARRAY['file1.html', 'file2.html']), file:='=?utf-8?B?'||encode('Из нескольких FILE в PS.ps', 'base64')||'?=', type:='application/ps', code:='base64'), -- задаём вложение из нескольких FILE в PS
    pg_curl_mime_data(html2pdf('Здравствуй, мир!'), file:='=?utf-8?B?'||encode('Из HTML в PDF.pdf', 'base64')||'?=', type:='application/pdf', code:='base64'), -- задаём вложение из HTML в PDF
    pg_curl_mime_data(html2ps('Здравствуй, мир!'), file:='=?utf-8?B?'||encode('Из HTML в PS.ps', 'base64')||'?=', type:='application/ps', code:='base64'), -- задаём вложение из HTML в PS
    pg_curl_mime_data(html2pdf(ARRAY['Здравствуй, мир!', 'До свидания, мир!']), file:='=?utf-8?B?'||encode('Из нескольких HTML в PDF.pdf', 'base64')||'?=', type:='application/pdf', code:='base64'), -- задаём вложение из нескольких HTML в PDF
    pg_curl_mime_data(html2ps(ARRAY['Здравствуй, мир!', 'До свидания, мир!']), file:='=?utf-8?B?'||encode('Из нескольких HTML в PS.ps', 'base64')||'?=', type:='application/ps', code:='base64'), -- задаём вложение из нескольких HTML в PS
    pg_curl_mime_data(url2pdf('https://google.com'), file:='=?utf-8?B?'||encode('Из URL в PDF.pdf', 'base64')||'?=', type:='application/pdf', code:='base64'), -- задаём вложение из URL в PDF
    pg_curl_mime_data(url2ps('https://google.com'), file:='=?utf-8?B?'||encode('Из URL в PS.ps', 'base64')||'?=', type:='application/ps', code:='base64'), -- задаём вложение из URL в PS
    pg_curl_mime_data(url2pdf(ARRAY['https://google.com', 'https://google.ru']), file:='=?utf-8?B?'||encode('Из нескольких URL в PDF.pdf', 'base64')||'?=', type:='application/pdf', code:='base64'), -- задаём вложение из нескольких URL в PDF
    pg_curl_mime_data(url2ps(ARRAY['https://google.com', 'https://google.ru']), file:='=?utf-8?B?'||encode('Из нескольких URL в PS.ps', 'base64')||'?=', type:='application/ps', code:='base64'), -- задаём вложение из нескольких URL в PS
    pg_curl_header_append('Connection', 'close'), -- отключаемся после выполнения
    pg_curl_easy_perform(), -- выполняем
    pg_curl_easy_getinfo_char('CURLINFO_HEADERS') -- получаем результат
) SELECT pg_curl_easy_getinfo_char FROM s; -- возвращаем результат
$BODY$;

И всё это можно выполнять асинхронно в фоне с помощью планировщика.
Поделиться публикацией

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 7

    +11

    А зачем?

      +6
      image
        +2
        Ещё троллейбус из буханки можно запостить
        +1
        Статья оборвалась так же неожиданно, как и началась.

        Я как раз в этом месяце познакомился с необходимостью генерировать pdf, — тоже выбрал вариант конвертации html в pdf, но я использовал библиотеку на php. Ещё лучше вариант — конвертировать хромом, но пока лень переписывать код.

        В статье не хватает информации об ограничениях библиотеки. Нет сравнения с другими библиотеками. Нет даже минимальных бенчмарков и примеров что получается в конечном итоге.
          +1

          Согласен. Но я бы делал на python. Но это не столь принципиально. Важно другое — я не вижу целесообразности делать это через базу. Непонятны ограничения механизма и в какой момент времени он может сломаться. И вообще может быть установка расширении вообще заблокирована (например, БД — managed instance в облаке).
          Пока на ум приходит только история про троллейбус из буханки.


          P.s. ну, и автору — я так и не понял, как прикрутили curl к почте. Я вижу только создание payload'а для передачи в смтп клиент. Где Smtp user, password, host? А если там tls ?

            0
            как прикрутили curl к почте
            Где Smtp user, password, host? А если там tls ?
            это стандартные функции в curl
              0
              Важно другое — я не вижу целесообразности делать это через базу.
              например, для ежемесячной отправки PDF-счетов клиентам по электронной почте не нужно ничего, кроме базы

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое