Есть ли способ сгенерировать pdf, содержащий не-ascii символы с Пизой из шаблона django? - PullRequest
19 голосов
/ 28 октября 2009

Я пытаюсь создать 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 поэтому в соответствии с документацией Пизы я пытался установить шрифт в теле шаблона в разделе стиля.

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

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

Ответы [ 5 ]

29 голосов
/ 24 ноября 2009

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

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')
3 голосов
/ 28 октября 2009

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

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

с

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

Или закажите этот ответ на html to pdf для сайта Django?

2 голосов
/ 27 января 2010

Вам нужно изменить шаблон 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 голос
/ 19 октября 2017

Я столкнулся с той же проблемой с кириллическими символами.

Решение содержало два этапа: 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

0 голосов
/ 27 июля 2010

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

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