Пользовательский шрифт @font-face неправильно отображается с xhtml2pdf для django

Я пытаюсь использовать собственный шрифт в своих попытках отобразить PDF-файл из HTML.

Я попробовал это в HTML, шрифт отображается, поэтому путь к шрифту должен быть правильным, и он, вероятно, используется правильно. Шрифт имеет тип .ttf и согласно документам на http://xhtml2pdf-base.googlecode.com/hg/doc/xhtml2pdf-en.html должно отображаться, но не отображается.

Вот что у меня есть в тегах стиля:

@font-face {
  font-family: "Swiss";
  src: url("/static/font/swiss.ttf");
}
body {
  font-family: "Swiss";
  font-size: 12px;
}

И html:

<body>
  asdf
</body>

Я пробовал много вещей, удаляя кавычки с URL-адреса шрифта и семейства шрифтов, мое тело заключено в теги HTML, поэтому html правильно отформатирован. Все отображается нормально при отображении на веб-странице, но не отображается должным образом при преобразовании в PDF. Может ли кто-нибудь помочь мне найти ошибку?


person Ken Yu    schedule 23.01.2013    source источник


Ответы (3)


Лучший способ — использовать обратный вызов для получения шрифтов с использованием пути к файловой системе. Является более точным, а также вам не нужно обращаться к веб-серверу для каждого ресурса (значение ресурса, шрифты, изображения и т. д.).

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

def fetch_resources(uri, rel):
    find_file_in_path_using_uri
    return path

Кстати, я думаю, что ваша проблема в том, что вы не собрали статические данные, поэтому шрифты на самом деле не находятся в /static/font/swiss.ttf. Я имею в виду, что их нет вне django, а xhtml2pdf вне django. Я не уверен на 100%.

person n3storm    schedule 28.03.2013

У меня была такая же проблема. gdrimes был прав. После изменения URL-адреса с относительного:

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

до абсолютного

@font-face {
            font-family: FreeSans;
            src: url("/home/rok/Documents/Muzey/muzey/website/templates/pdf/FreeSans.ttf");
        }

шрифт в моем документе PDF был обновлен.

person Rok Klancar    schedule 13.11.2019
comment
танки бро, это решение, ты лучший - person Juan Diego Ramirez; 04.12.2020

Я опаздываю на эту тему, но недавно у меня была такая же проблема. Предложение использовать обратный вызов для предоставления определения шрифта действительно работает (но в моем случае имелись некоторые ограничения, потому что мне нужна была некоторая логика для использования разных шрифтов в зависимости от внешних условий). Однако я обнаружил, что проблема заключается в том, что url("/static/font/swiss.ttf") должен быть абсолютным местоположением файла, а не относительным местоположением вашего приложения, как показано. Например, в моем случае местоположение моего приложения было «/home/user/app», URL-адрес должен быть: url("/home/user/app/static/font/swiss.ttf").

person gdrimes    schedule 08.08.2018