С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 22.08.2012
Сообщений: 43

xhtml2pdf кириллица

23.03.2023, 11:44. Показов 2990. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Генерирует кубики вместо киррилицы.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def fetch_pdf_resources(uri, rel):
    if uri.find(settings.STATIC_URL) != -1:
        path = os.path.join(settings.STATIC_ROOT, uri.replace(settings.STATIC_URL, ''))
    else:
        path = None
    return path
 
 
def render_pdf_new(request, *args, **kwargs):
    pk = kwargs.get('pk')
    pdf = get_object_or_404(Story, pk=pk)
 
    template_path = 'pages/pdf.html'
    context = {'pdf': pdf}
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename="report.pdf"'
    template = get_template(template_path)
    html = template.render(context)
 
    pisa_status = pisa.CreatePDF(html.encode("UTF-8"), dest=response, encoding='UTF-8', link_callback=fetch_pdf_resources)
    if pisa_status.err:
       return HttpResponse('We had some errors <pre>' + html + '</pre>')
    return response
Код, вообщем-то стандартный.

Шаблон:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="ru">
 
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Title</title>
<style>
    @font-face {
        font-family: Raleway;
        src: url('pages/fonts/raleway-regular.woff2');
    }
    body { 
        font-family: Raleway, serif;
    }
</style>
</head>
<body>
dfgdfgdfgdfgdfgdfgdgdfg
{{ pdf.content }}
</body>
</html>
Общих решения в интернете два, и оба не помогают.

1. Добавил келбек функцию, якобы рендер не может загружать шрифт.
2. Прописать абсолютный путь для шрифта. Причем не относительно хостинга а относительно джанго.

Оба не помогают.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2023, 11:44
Ответы с готовыми решениями:

Кириллица в Python
Доброго времени суток. Помогите с проблемой. response = requests.get('http://xn--b1aaibmdhgx7gra.xn--p1ai/protect/test.txt') if...

Подсчитать количество вхождений буквы (кириллица) в строку (кириллица)
Суть такая: по требованию программы ввести строку символов (обыкновенный текст, кириллица(!!!)) и посчитать количество вхождений, если...

кириллица
Подскажите, как сделать ,чтобы в Borland C вывод был русскими буквами. Я написал setlocale(LC_ALL, &quot;Russian&quot;); вывод стал на...

6
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
23.03.2023, 17:17
Цитата Сообщение от Destrifer Посмотреть сообщение
Добавил келбек функцию, якобы рендер не может загружать шрифт.
Так шрифт при этом успешно загружается или нет?
Плюс зачем изобретать велосипед, когда уже есть готовый вариант? https://xhtml2pdf.readthedocs.... -in-django
Цитата Сообщение от Destrifer Посмотреть сообщение
Прописать абсолютный путь для шрифта. Причем не относительно хостинга а относительно джанго.
Это как? Абсолютный путь на то и абсолютный, потому что он одинаков относительно всего.
0
0 / 0 / 1
Регистрация: 22.08.2012
Сообщений: 43
23.03.2023, 20:35  [ТС]
Ок. Подтянул оттуда.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def link_callback(uri, rel):
    """
    Convert HTML URIs to absolute system paths so xhtml2pdf can access those
    resources
    """
    result = finders.find(uri)
    if result:
        if not isinstance(result, (list, tuple)):
            result = [result]
        result = list(os.path.realpath(path) for path in result)
        path = result[0]
    else:
        sUrl = settings.STATIC_URL  # Typically /static/
        sRoot = settings.STATIC_ROOT  # Typically /home/userX/project_static/
        mUrl = settings.MEDIA_URL  # Typically /media/
        mRoot = settings.MEDIA_ROOT  # Typically /home/userX/project_static/media/
 
        if uri.startswith(mUrl):
            path = os.path.join(mRoot, uri.replace(mUrl, ""))
        elif uri.startswith(sUrl):
            path = os.path.join(sRoot, uri.replace(sUrl, ""))
        else:
            return uri
 
    # make sure that file exists
    if not os.path.isfile(path):
        raise Exception(
            'media URI must start with %s or %s' % (sUrl, mUrl)
        )
    return path
 
 
def render_pdf_new(request, *args, **kwargs):
    pk = kwargs.get('pk')
    pdf = get_object_or_404(Story, pk=pk)
 
    template_path = 'pages/pdf.html'
    context = {'pdf': pdf}
    # Create a Django response object, and specify content_type as pdf
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="report.pdf"'
    # find the template and render it.
    template = get_template(template_path)
    html = template.render(context)
 
    # create a pdf
    pisa_status = pisa.CreatePDF(
       html.encode("UTF-8"), dest=response, encoding='UTF-8', link_callback=link_callback)
    # if error then show some funny view
    if pisa_status.err:
       return HttpResponse('We had some errors <pre>' + html + '</pre>')
    return response
Шаблон:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="ru">
 
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Title</title>
<style>
    @font-face {
        font-family: Raleway;
        src: url('static/pages/fonts/Montserrat-Regular.woff2');
    }
    body { 
        font-family: Raleway, serif;
    }
</style>
</head>
<body>
dfgdfgdfgdfgdfgdfgdgdfg
{{ pdf.content }}
</body>
</html>
Шрифт по адресу: 127.0.0.1:8000/static/pages/fonts/Montserrat-Regular.woff2
корректно скачивается

Кубики на месте.

Добавлено через 6 минут
Цитата Сообщение от kazak Посмотреть сообщение
Это как? Абсолютный путь на то и абсолютный, потому что он одинаков относительно всего.
Справедливый вопрос.
Пока искал решение в закромах стаковерфлоу, проскочила строчка что путь должен быть абсолютным не относительно папок linux сервера (/src/bin..) и по какому физически лежит этот файл, а относительно виртуальной машины джанго. Не уверен что это утверждение несет большую смысловую нагрузку, но как говорится, чем богат
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
24.03.2023, 15:56
Лучший ответ Сообщение было отмечено Destrifer как решение

Решение

У меня с woff2 шрифтами также квадратики, с ttf работает нормально.
1
0 / 0 / 1
Регистрация: 22.08.2012
Сообщений: 43
24.03.2023, 18:41  [ТС]
А с ttf вообще ошибка
Миниатюры
xhtml2pdf кириллица  
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
24.03.2023, 20:09
Почему шрифты в папке Temp ищутся, и есть ли там искомый файл?
0
0 / 0 / 1
Регистрация: 22.08.2012
Сообщений: 43
24.03.2023, 22:06  [ТС]
Ну тесты я провожу на локалке, на встроенном сервере.
Или папку юзает виртуальное окружение. Не силен в этом.
Но шрифт там создается, с размером 0 байт.
Вроде как папка temp только для чтения, но если запустить генерацию еще раз, новый файл становится 0 байт, а старый становится полным.
Так много вопросов и так мало ответов.

В итоге попробовал на серваке - работает.
Ответ был шрифте ttf и коде и тутора как kazak и говорил.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2023, 22:06
Помогаю со студенческими работами здесь

Кириллица
Добрый день. Помогите, пожалуйста, с возникшей проблемой. Имеется следующий код: import os, subprocess import fnmatch import...

Кириллица
Добрый день! Что сделать, что б кириллицу можно было вводить?

Кириллица
Доброго времени суток! Заранее извиняюсь за весьма глупый вопрос, но все же string name; int main() { setlocale...

Кириллица в C#
Доброго времени суток. У меня такая проблема, прога не считает кол-во букв кириллицы в тексте:( Как это можно сделать? Вот мой код...

Кириллица
Получаю данные из бд и на серверной стороне данные приходят в нормальной кодировке ( скрин 1) msg.append(new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru