Pull to refresh

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

Reading time 4 min
Views 4.1K
Для приготовления преобразования из 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$;

И всё это можно выполнять асинхронно в фоне с помощью планировщика.
Tags:
Hubs:
+2
Comments 7
Comments Comments 7

Articles