Django PDF Экспорт - PullRequest
       3

Django PDF Экспорт

5 голосов
/ 19 октября 2011

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

query = ModelA.objects.filter(p_id=100)

class ModelA(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)
    p_id = models.IntegerField()
    description = models.TextField()

Мне нужно показать значения для name, description и pid в сгенерированном PDF.

Ответы [ 4 ]

9 голосов
/ 21 октября 2011

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

Я использовал ранее упомянутую настройку ReportLab / Pisa, но нашел, что она довольно ограничивающая, большинство макетов приходится создавать с использованием таблиц, а многие части спецификации CSS2 еще не реализованы.

Более простая в использовании библиотека - wkhtmltopdf , которая представляет собой автономный дистрибутив WebKit. Это дает преимущество в том, что ваши шаблоны отображаются так же, как любой браузер webkit, и, таким образом, вы можете использовать специфические дополнения webkit, такие как части спецификации CSS3, существующие в WebKit.

Используя библиотеку-оболочку django-wkhtmltopdf вы можете render_to_pdf в своем представлении вместо обычного Django render_to_response.

Отказ от ответственности: я участник этой библиотеки.

Обновление

Эта библиотека была преобразована в CBV, и большая часть информации ниже (которую я оставлю, чтобы помочь добавить некоторый контекст) теперь реализована в самой библиотеке для удобства.

См. Документацию quickstart для примера того, как реализовать приведенный ниже кодовый блок. Если вам нужно использовать более сложное использование, вы можете создать подкласс PDFTemplateView и добавить различные параметры, такие как имя файла и поля.

Пример просмотра:

from django.shortcuts import render_to_response
from wkhtmltopdf import render_to_pdf

def pdf(request):
    context.update({'objects': ModelA.objects.filter(p_id=100)})

    kwargs = {}
    if request.GET and request.GET.get('as', '') == 'html':
        render_to = render_to_response
    else:
        render_to = render_to_pdf
        kwargs.update(dict(
            filename='model-a.pdf',
            margin_top=0,
            margin_right=0,
            margin_bottom=0,
            margin_left=0))

    return render_to('pdf.html', context, **kwargs)

Условный оператор здесь позволяет вам передавать? As = html в представление, чтобы вы могли разрабатывать его в браузере. Это немного уродливый способ сделать это в настоящее время, но в скором времени планируется это исправить.

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

В этой заметке вы можете создавать шаблоны верхнего и нижнего колонтитула, которые будут использоваться на каждой странице вашего PDF, передавая их в render_to_pdf как часть kwargs.

2 голосов
/ 19 октября 2011

Просто сгенерируйте HTML-код так, как вам хотелось бы, и попросите xhtml2pdf преобразовать его в pdf.

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

0 голосов
/ 19 января 2017

Я создал приложение django только для этого: Django-pdf-generator .

В вашем views.py просто выполните:

from pdf_generator.renderers import render_pdf

def get_my_pdf(request):
    """
    returns a pdf file named my_awesome_pdf.pdf using awesome_pdf.html template
    """
    return render_pdf('my_awesome_pdf', request, 'awesome_pdf.html', context={})

Пустья знаю, полезно ли это вам.

0 голосов
/ 11 декабря 2014

Попробуйте wkhtmltopdf с python-pdfkit

Это, кажется, лучшее решение. Поддерживает JavaScript и CSS

...