django - пиза: добавление изображений в вывод PDF

Я использую стандартный пример из Интернета (http://www.20seven.org/journal/2008/11/pdf-generation-with-pisa-in-django.html) для преобразования представления / шаблона django в PDF.

Есть ли «простой» способ включить изображения (из URL-адреса или ссылки на сервере) в шаблон, чтобы они отображались в PDF-файле?


person jduncan    schedule 01.02.2010    source источник
comment
Ссылка мертва - вот она: 20seven. org / journal / 2008/11/11 /   -  person Gady    schedule 30.08.2013


Ответы (6)


Я заставил изображения работать. код выглядит следующим образом:

from django.http import HttpResponse
from django.template.loader import render_to_string
from django.template import RequestContext
from django.conf import settings
import ho.pisa as pisa
import cStringIO as StringIO
import cgi
import os

def dm_monthly(request, year, month):
    html  = render_to_string('reports/dmmonthly.html', { 'pagesize' : 'A4', }, context_instance=RequestContext(request))
    result = StringIO.StringIO()
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources )
    if not pdf.err:
        return HttpResponse(result.getvalue(), mimetype='application/pdf')
    return HttpResponse('Gremlins ate your pdf! %s' % cgi.escape(html))

def fetch_resources(uri, rel):
    path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

    return path

Это было свободно взято из http://groups.google.com/group/xhtml2pdf/browse_thread/thread/4cf4e5e0f4c99f55

person Community    schedule 01.02.2010
comment
fyi для пользователей, не использующих Django, MEDIA_ROOT - это каталог, в котором физически находится конвертируемый HTML-документ, а MEDIA_URL - это дружественная к http версия этого местоположения (например, для локального HTML-файла: MEDIA_URL = 'file:///' + MEDIA_ROOT) . В противном случае это хорошее общее решение! - person ecoe; 21.07.2014
comment
Что делать, если я использую S3? - person Charanjit Singh; 27.05.2021

Мне не удавалось отобразить изображения, несмотря на то, что я пробовал все решения, которые я мог найти в Google. Но эта выдумка сработала для меня, поскольку версия pisa для командной строки отображает изображения нормально:

    from tempfile import mkstemp

    # write html to a temporary file
    # can used NamedTemporaryFile if using python 2.6+
    fid, fname = mkstemp(dir='/tmp')
    f = open(fname, 'w+b')
    f.write(html)
    f.close()


    # now create pdf from the html 
    cmd = 'xhtml2pdf "%s"' % fname
    os.system(cmd)
    os.unlink(fname)

    # get the content of the pdf
    filename = fname+'.pdf'
    pdf = open(filename, 'r')
    content = pdf.read()

    pdf.close()
    os.unlink(pdf.name)

    # return content
    response = HttpResponse(content, mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=draft.pdf'

Это работало там, где изображения имели URL-адрес или полное имя пути, например.

<img src="/home/django/project/site_media/css/output/images/logo.jpg" />

<img src="http://www.mysite.com/css/output/images/logo.jpg" />
person PhoebeB    schedule 14.09.2010

Весь приведенный выше код у меня не сработал. В конце концов, у меня все заработало, поставив процедуру get_full_path. Итак, окончательный код выглядит так

def render_to_pdf( template_src, context_dict):
    now = datetime.now()
    filename = now.strftime('%Y-%m-%d') + '.pdf'
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")),result, path=path)

    if not pdf.err:
      response = HttpResponse(result.getvalue(), mimetype='application/pdf')
      response['Content-Disposition'] = 'attachment; filename="'+filename+'"'
      return response
   return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

def get_full_path_x(request):
    full_path = ('http', ('', 's')[request.is_secure()], '://',
    request.META['HTTP_HOST'], request.path)
    return ''.join(full_path) 
person vinod philip    schedule 15.04.2013

Вы также можете преобразовать изображение в base64.

http://www.motobit.com/util/base64-decoder-encoder.asp

С переходом на base64 у вас никогда не будет проблем со ссылками на изображения.

person Lara    schedule 05.03.2014
comment
Да, изображения можно конвертировать в base64. Пожалуйста, добавьте пример того, как поместить их в pdf. - person ebob; 16.06.2017

У меня работает следующая строка кода в HTML и Django version = 2.0.

<img src="{{company.logo.path}}" height="100px">
person Dhruv    schedule 19.10.2018

Вы всегда можете добавить изображения позже с помощью IText / ISharp.

person mark stephens    schedule 02.02.2010