Использование URL-адреса изображения для link_callback в библиотеке pisa html to pdf - PullRequest
3 голосов
/ 23 октября 2010

Относится к: django - pisa: добавление изображений в вывод PDF

У меня есть сайт, который использует Google Chart API для отображения множества отчетов пользователю, и я пытаюсь реализовать PDF-версию. Я использую параметр link_callback в pisa.pisaDocument, который отлично работает для локальных медиа (css / images), но мне интересно, будет ли он работать с удаленными изображениями (с помощью URL-адреса Google-диаграмм).

Из документации на веб-сайте Пизы они подразумевают, что это возможно, но не показывают, как:

Normaly Pisa ожидает, что эти файлы будут найдены на локальном диске. На них также можно ссылаться относительно исходного документа. Но программист может захотеть загрузить из различных источников, таких как Интернет, через HTTP-запросы или из базы данных или чего-либо еще.

Это в проекте Django, но это не имеет значения. Вот что я использую для рендеринга:

html = render_to_string('reporting/pdf.html', keys,
                        context_instance=RequestContext(request))
result = StringIO.StringIO()
pdf = pisa.pisaDocument(
        StringIO.StringIO(html.encode('ascii', 'xmlcharrefreplace')),
        result, link_callback=link_callback)
return HttpResponse(result.getvalue(), mimetype='application/pdf')

Я пытался заставить link_callback вернуть объект запроса urllib, но, похоже, он не работает:

def link_callback(uri, rel):
    if uri.find('chxt') != -1:
        url = "%s?%s" % (settings.GOOGLE_CHART_URL, uri)
        return urllib2.urlopen(url)
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

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

1 Ответ

6 голосов
/ 25 октября 2010

Ну, это было намного проще, чем я ожидал. В вашем методе link_callback, если URI является удаленным изображением, просто верните это значение.

def link_callback(uri, rel):
    if uri.find('chart.apis.google.com') != -1:
        return uri
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

Браузер гораздо менее требователен к URL-адресу изображения, поэтому убедитесь, что URI правильно указан для Пизы. У меня были пробелы, поэтому сначала он не работал (вместо w / 'исправил это).

...