Подтвердить что ты не робот

Есть ли способ генерировать 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, а затем в юникод пользователя (html, "UTF-8" ), но он выдает TypeError.

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

с

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

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

Ответ 3

Вам нужно изменить свой шаблон 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 с кириллическими символами.

Ответ 4

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

Решение состоит из двух шагов: 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

Ответ 5

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

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