Как создать PDF из HTML в Django

В отличие от PHP, в Python не так много доступных библиотек для создания PDF-файлов из HTML, однако это не поддерживается. В этой статье вы узнаете, как создавать PDF-файлы с помощью wkhtmltopdf в Django.

wkhtmltopdf — это инструмент командной строки для рендеринга HTML в PDF и различные форматы изображений с использованием движка рендеринга Qt WebKit. Они работают полностью «без головы» и не требуют отображения или обслуживания дисплея.

Требования

Вам нужен wkhtmltopdf, доступный в вашей системе и доступный в командной строке.

  • Окна: Вы можете скачать установщик для каждой архитектуры (x86 и x64) в площадь установки. Хотя вы можете изменить путь к исполняемому файлу wkhtmltopdf позже в коде, желательно иметь wkhtmltopdf доступно как переменная среды в вашей системе. Вы можете прочитайте, как создать переменные окружения в окнах в этой статье.
  • Debian / Ubuntu: Вы можете установить дистрибутив из wkhtmltopdf непосредственно в консоли, используя следующую команду:
$ sudo apt-get install wkhtmltopdf

Предупреждение! Версии в репозиториях Debian / Ubuntu имеют ограниченную функциональность (потому что она скомпилирована без патчей QT wkhtmltopdf), такие как добавление контуров, верхних и нижних колонтитулов, оглавления и т. Д. Чтобы использовать эти опции, вы должны установить статический двоичный файл из wkhtmltopdf сайт или вы можете использовать этот скрипт.

Посетить домашняя страница wkhtmltopdf для получения дополнительной информации здесь.

Реализация

Теперь, когда у нас есть wkhtmltopdf, доступный в нашей среде, нам просто нужно его использовать! однако вместо того, чтобы обрабатывать консольные команды самостоятельно, используйте PDFKit, чтобы легко создавать PDF-файлы в Django. PDFKit — это оболочка Python для преобразования html в pdf с использованием движка рендеринга webkit (wkhtmltopdf) и qt, вы можете посетите хранилище в Github для получения дополнительной информации.

Включите библиотеку PDFKit в свой проект django, используя следующую команду:

$ pip install pdfkit

Поскольку wkhtmltopdf выполняет тяжелую работу за вас, использование PDFKit действительно просто и охватывает практически все варианты использования:

  • Создать PDF из HTML-строки.
  • Создайте PDF из веб-адреса (внешний или проектный URL).
#import pdfkit into your class
import pdfkit
# Generate PDF from a web URL (maybe only from your project)
pdfkit.from_url('http://google.com', 'out.pdf')
# Generate PDF from a html file.
pdfkit.from_file('file.html', 'out.pdf')
# Generate PDF from a plain html string.
pdfkit.from_string('Hello!', 'out.pdf')
# Save the PDF in a variable
myPdf = pdfkit.from_url('http://google.com', False)

И вы в основном создаете PDF-файлы на лету легко и быстро.

Примеры

С помощью Django и PDFKit легко создавать PDF-файлы, ознакомьтесь со следующими примерами:

Сохранить PDF на сервере

Чтобы сохранить PDF-файл локально, используйте любой метод и укажите путь и имя файла, где файл должен быть сохранен в качестве второго параметра.

import pdfkit
from django.http import HttpResponse
def index(request):
pdf = pdfkit.from_url("http://site.com", "ourcodeworld.pdf")
return HttpResponse("Everything working good, check out the root of your project to see the generated PDF.")

Предыдущий пример будет создайте PDF в корне вашего проекта Django.

Вернуть PDF как ответ

Вы можете напрямую извлечь файл из PDFKit, не сохраняя его в своей системе, просто укажите False в качестве параметра назначения.

Вы можете использовать следующий фрагмент, чтобы вернуть PDF в качестве ответа:

import pdfkit
from django.http import HttpResponse
def index(request):
# Use False instead of output path to save pdf to a variable
pdf = pdfkit.from_url('http://site.com', False)
response = HttpResponse(pdf,content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'
return response

Если вы перейдете к маршруту с помощью этой функции, браузер начнет загружать PDF, сгенерированный контроллером.

Создать PDF из маршрута проекта

Вы можете сгенерировать PDF из маршрута (он должен быть явно зарегистрирован) вашего проекта и использовать pdf.from_url метод.

import pdfkit
from django.http import HttpResponse
def template(request):
# Returns some HTML as response
return HttpResponse("Hello World")
def pdf(request):
# Create a URL of our project and go to the template route
projectUrl = request.get_host() + '/template'
pdf = pdfkit.from_url(projectUrl, False)
# Generate download
response = HttpResponse(pdf,content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'
return response

Вывод в формате PDF будет документом с Hello World! как содержание.

Замечания: альтернативно, вместо создания запроса к конечной точке вашего проекта, вы можете отобразить шаблон в переменной как html, а затем использовать метод pdfkit.from_string.

Другие настройки

Пользовательский путь wkhtmltopdf

Если вы хотите изменить путь, по которому находится wkhtmltopdf, вы можете изменить его с помощью метода конфигурации pdfkit:

config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))
pdfkit.from_string("Hello World", output_file, configuration=config)

Настройки PDF

Вы можете указать все параметры wkhtmltopdf. Вы можете опустить «-» в названии опции. Если опция без значения, используйте None, False или » для значения dict:

options = {
'page-size': 'Letter',
'margin-top': '0.75in',
'margin-right': '0.75in',
'margin-bottom': '0.75in',
'margin-left': '0.75in',
'encoding': "UTF-8",
'no-outline': None
}
pdfkit.from_url('http://google.com', 'out.pdf', options=options)

Вывод wkhtmltopdf

По умолчанию PDFKit покажет все wkhtmltopdf выход:

вывод wkhtmltopdf

Если вы не хотите этого, вам нужно установить тихую опцию в конфигурации метода, который вы используете:

options = {
'quiet': ''
}
pdfkit.from_url('google.com', 'out.pdf', options=options)

Основное устранение неполадок

При использовании PDFKit в Python есть две известные проблемы:

IOError — Не найден исполняемый файл wkhtmltopdf

Эта ошибка возникает из-за того, что в вашей системе нет дистрибутива wkhtmltopdf. В случае, если вы уже установили, это, вероятно, не доступно как команда в консоли. Откройте системную консоль и убедитесь, что wkhtmltopdf команда существует.

IOError — Команда не выполнена

Что-то пошло не так с wkhtmltopdf, и операция не может быть выполнена. Попробуйте выполнить простую команду в консоли и проверьте наличие возможных ошибок (веб-страница не существует, файл не существует и т. Д.).

Повеселись !

Ссылка на основную публикацию
Adblock
detector