Django текущая страница в PDF - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь создать кнопку «конвертировать в pdf» для текущей страницы (подробности службы, которая является динамической страницей). Я пытался работать с ReportLab (как предполагает документация Django, но я просто не могу заставить его работать).и документация ReportLab не говорит ни слова о таких возможностях)

на данный момент я могу создать pdf-файл из этого представления: (отредактируйте, вернулись к коду из документации django для ясности) views.py

        @login_required
    def service_detail(request, pk):
        service = get_object_or_404(Service, pk=pk)
        return render(request, 'detail.html', {'service':service, 'pk':pk})

    @login_required
    def render_to_pdf(request):
        # Create the HttpResponse object with the appropriate PDF headers.
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename="service.pdf"''

        # Create the PDF object, using the response object as its "file."
        p = canvas.Canvas(response)

        # Draw things on the PDF. Here's where the PDF generation happens.
        p.drawString("Hello world.")

        # Close the PDF object cleanly, and we're done.
        p.showPage()
        p.save()
        return response

urls.py

url(r'^service/(?P<pk>\d+)/$', views.service_detail, name='service_detail'), #Services details
url(r'^render_to_pdf/', views.render_to_pdf, name='render_to_pdf'),

Шаблон детали службы включает в себя динамические элементы, такие как:

Your location: {{ service.user_location }} <br><br>

Кто-нибудь знает, что я могу сделать или чтодругие технологии, которые я могу использовать для создания такого PDF?

В основном я работаю с Python, Django, HTML и CSS

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Возможно, вы захотите рассмотреть пакет django-wkhtmltopdf для создания PDF-файлов в Django.

Используя это, вы можете макетировать PDF как HTML-страницу (с разметкой CSS),как и любой другой вид, но он будет отображаться в виде PDF-файла.Обратите внимание, что вам нужно будет установить двоичный файл wkhtmltopdf , чтобы он заработал.

Добавив префикс ?as=html в URL, вы сможете просматривать свою страницу в браузере во время разработки.

В пакете django-wkhtmltopdf используются представления на основе классов.Вот пример:

views.py

from django.utils.text import slugify
from wkhtmltopdf.views import PDFTemplateView

class Portfolio(PDFTemplateView):
    template_name = 'frontend/portfolio.html'

    def get_filename(self):
        return slugify('portfolio ' + self.request.user.first_name + ' ' + self.request.user.last_name) + '.pdf'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

urls.py

from django.urls import path
from . import views

app_name = 'frontend'

urlpatterns = [
    path(
        '<slug:group_slug>/<int:school_year_pk>/portfolio/',
        views.Portfolio.as_view(),
        name='portfolio'
    ),
    ...
0 голосов
/ 12 июня 2018

content_type должно быть application/pdf, а не service/pdf, также попробуйте указать имя файла pdf без пробелов, например service.pdf, из docs , также вы забыли ввести attachment вContent-Disposition

попробуйте записать pdf в response как и используйте BytesIO:

from io import BytesIO 

@login_required
def render_to_pdf(request):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'inline; filename="service.pdf'
    buffer = BytesIO()
    p = canvas.Canvas(buffer)

    # Start writing the PDF here
    p.drawString(100, 100, 'Hello world.')
    # End writing

    p.showPage()
    p.save()

    pdf = buffer.getvalue()
    buffer.close()
    response.write(pdf)

    return response
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...