Есть ли способ генерировать pdf, содержащий символы не ascii с pisa из шаблона django?

Я пытаюсь создать pdf из шаблона, используя этот фрагмент:

def write_pdf(template_src, context_dict):
    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)
    if not pdf.err:
        return http.HttpResponse(result.getvalue(), mimetype='application/pdf')
    except Exception('PDF error')

все нелатинские символы отображаются неправильно, шаблон и представление сохраняются с помощью кодировки utf-8.

Я попытался сохранить представление как ANSI, а затем для пользователя unicode (html,"UTF-8"), но он бросает TypeError.

также я подумал, что, возможно, это потому, что шрифты по умолчанию как-то не поддерживают utf-8 поэтому, согласно документации pisa, я попытался установить fontface в тело шаблона в разделе Стиль.

это все еще не дало никаких результатов.

есть ли у кого-нибудь идеи, как решить эту проблему?

5 ответов


это работает для меня:

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

попробуйте заменить

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

С

pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')

или проверить этот ответ на html в pdf для сайта Django?


вам нужно изменить шаблон django. Добавьте в таблицу стилей новое лицо шрифта, которое будет ссылаться на файл шрифта с символами, используемыми в документе. И этот файл шрифта должен быть доступен с вашего сервера (в Ubuntu вы можете найти файлы со шрифтами в каталоге /usr/share/fonts/truetype/). Например:

@font-face {
  font-family: DejaMono; 
  src: url(font/DejaVuSansMono.ttf);
}

тогда, если у вас есть следующий HTML код:

<div>Some non-latin characters</div>

вы можете отобразить этот текст в шрифте DejaMono с помощью этого правила CSS:

div { font-family: DejaMono; }

этот работает для меня, когда я генерирую PDF-документы с кириллическими символами.


я столкнулся с той же проблемой с кириллицей.

решение содержит два шага: 1. Укажите файл шрифта в HTML-файле

<style type="text/css">
@font-face {
  font-family: Arial; src: url("files/arial.ttf");
}
body {
  font-family: Arial;
}
</style>

2. Дайте корневой путь" pisa " (чтобы найти файл шрифта по относительному пути) в моем случае это было что-то вроде этого

pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT)

потому что шрифты были размещены в PATH_TO_DJANGO_PROJECT/files / arial.ttf


Если вы вызываете createPDF вместо метода pisaDocument, вы можете использовать

pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')