Проблема с арабским языком в xhtml2pdf django

Я использую xthml2pdf для создания счета-фактуры на арабском языке. Я много искал, чтобы решить эту проблему и следовал всем шагам, но я не знаю, почему это не работает.

Код утилиты:

def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), dest=result, encoding='UTF-8')
if not pdf.err:
    return HttpResponse(result.getvalue(), content_type='application/pdf')

Просмотр кода:

pdf = render_to_pdf('pdf/invoice.html'), context)
    if pdf:
        response = HttpResponse(pdf, content_type='application/pdf')
        filename = "invoice-%s.pdf" % invoice_number
        content = "inline; filename= %s" % filename
        response['Content-Disposition'] = content
        return response

И, наконец, HTML-код:

<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta charset="UTF-8">
<style>
  @font-face{font-family:samim; src: url('/assets/fonts/Shabnam-FD.ttf') }
  body{
      background: #fff;
      font-family: samim !important;
      direction: rtl !important;
  }
   </style>
   </head>
  <body>
   <div>
  <pdf:language name="arabic"/>
  <p>سلام</p>
  </div>
  </body>
  </html>

Но что в конце концов порождает enter image description here

При использовании xhtml2pdf с Django разрешите разрешать URL-ссылки с помощью настроек Django STATIC_URL и MEDIA_URL. Таким образом, в любом окружении ваш код будет работать, потому что Django сделает всю работу.

xhtml2pdf allows users to specify a link_callback parameter to point to a function that converts relative URLs to absolute system paths. See one example here. [xhtml2pdf-docs]

Используя эту функцию (например, url_converter), ваш код должен выглядеть так:

def render_to_pdf(template_src, context_dict={}):
    #•••Rest of your code•••
    result = BytesIO()
    result.seek(0)
    status = pisa.CreatePDF(html, dest=result, link_callback=url_converter)
    if not status.err:
        result.seek(0)
        return FileResponse(result, content_type='application/pdf')

Не забудьте collectstatic вставить файлы, чтобы Django правильно определил местоположение ваших файлов.

После того, как я попробовал много разных вещей для генерации PDF. Я пробовал xhtmltopdf, а также wkhtmltopdf и т.д. Позже развертывание было очень сложным для меня, я получал ошибку за ошибкой. Затем я перешел на selenium 4.0, который имеет легкую опцию pdf без всех настроек. Я предлагаю вам перейти на selenium here легко. Но единственная проблема - это облачные ресурсы. Вы можете оценить это для вашей дальнейшей выгоды.

Вернуться на верх