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

xhtml2pdf кириллица

23.03.2023, 11:44. Показов 3109. Ответов 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
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
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
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
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
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
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
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru