xhtml2pdf не применяет CSS при создании PDF (HTML в PDF)
Конверсия:
html = template.render(context)
resultFile = open(filepath, "w+b")
pdf = pisa.CreatePDF(html.encode('utf-8'), dest=resultFile,encoding='utf-8', link_callback=link_callback)
link_callback
def link_callback(uri, rel):
sUrl = settings.STATIC_URL # Typically /static/
sRoot = settings.STATIC_ROOT
mUrl = settings.MEDIA_URL # Typically /static/media/
mRoot = settings.MEDIA_ROOT # Typically /home/userX/project_static/media/
# convert URIs to absolute system paths
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 # handle absolute uri (ie: http://some.tld/foo.png)
# 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
Я создал PDF с помощью xhtml2pdf. Файл создан, но CSS к нему вообще не применяется. Я проверил путь, который возвращается из link_callback, он правильный, но в pdf не применяется css вообще.
CSS:
#page_1 {position:relative; overflow: hidden;margin: 64px 0px 65px 0px;padding: 0px;border: none;}
#page_1 #p1dimg1 {position:absolute;top:0px;left:20%;z-index:-1;width:600px;height:870px;}
#page_1 #p1dimg1 #p1img1 {width:600px;height:870px;}
#page_2 {position:relative; overflow: hidden;padding-left: 100px;border: none;height: 854px;}
#page_2 #p2dimg1 {position:absolute;left:27%;z-index:-1;width:490px;height:669px;}
#page_2 #p2dimg1 #p2img1 {width:490px;height:669px;}
Путь к CSS, который я получил: /Users/mypc/project/project/static/css/lender_borrower.css
2 ответа
xhtml2pdf не позволяет ссылаться на внешние таблицы стилей.
Вам нужно будет предоставить внутреннюю таблицу стилей - что означает написание ваших стилей в заголовке шаблона HTML, между тегами
<style type="text/css">HERE</style>
Однако обратите внимание, что многие стили CSS не поддерживаются. Посмотрите документы, чтобы узнать, что CSS поддерживается.
Пример шаблона ниже:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Whatever</title>
<style type="text/css">
# PLACE ALL YOUR CSS STYLING HERE
</style>
</head>
<body>
# content goes here
</body>
</html>
Изображения, фоны и таблицы стилей загружаются из HTML-документа. Обычно xhtml2pdf ожидает, что эти файлы будут найдены на локальном диске. На них также можно ссылаться относительно исходного документа. Но программист может захотеть загружать из различных источников, таких как Интернет, через HTTP-запросы, из базы данных или из чего-либо еще. Поэтому вы можете определить link_callback, который будет обрабатывать эти запросы.
Согласно документам, определенно есть способ добавить внешние таблицы стилей с помощью функции link_callback, хотя я не понимаю, как это сделать. Может ли кто-нибудь помочь с этим? В частности, загрузка статических файлов в django.