Преобразование относительного URL-пути в абсолютный URL для xhtml2pdf - PullRequest
0 голосов
/ 24 октября 2019

Я очень неопытен в этом, поэтому у меня проблемы с пониманием предоставленной документации для xhtml2pdf, так как это очень расплывчато в деталях. Пожалуйста, скажите мне, что я делаю неправильно.

В соответствии с документацией, чтобы преобразовать относительный путь URL в абсолютный, мне нужно использовать предоставленную функцию:

def link_callback(uri, rel):
    """
    Convert HTML URIs to absolute system paths so xhtml2pdf can access those
    resources
    """
    # use short variable names
    sUrl = settings.STATIC_URL      # Typically /static/
    sRoot = settings.STATIC_ROOT    # Typically /home/userX/project_static/
    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

Я добавил точно такую ​​же функцию к своему views.py и используя эту функцию для генерации pdf (также в views.py, почти непосредственно взятой из документов):

<code>def PGP_result(request):

    data = request.session['form_data']

    lietuvosPgp = data['LtPGP']
    valstybe = data['pVal']
    kastai = data['iKastai']
    rezultatas = data['result']  
    today = timezone.now()

    params = {
            'LtPgp': lietuvosPgp,
            'Valstybe': valstybe,
            'Kastai': kastai,
            'Rezultatas': rezultatas,
            'today': today,
        }

    template_path = 'PGP_results_pdf.html'

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="test.pdf"'

    template = get_template(template_path)
    html = template.render(params)

    pisaStatus = pisa.CreatePDF(
        html, dest=response, link_callback=link_callback
        )
    if pisaStatus.err:
        return HttpResponse('Ups kažkas nepavyko <pre>' + html + '
') ответ возврата

Pdf генерируется, но файл шрифта находится вПапка static/fonts не используется. Я не могу понять, как правильно написать относительный путь URL, чтобы он был преобразован в абсолютный. Я думаю, что решение должно быть очень простым, но мой недостаток опыта мешает мне найти его (я устал от различных способов написания, но ни один из них не работал).

Мой (текущий) код шаблона (не знаюкак исправить src: url(sUrl/fonts/Arial.ttf) часть):

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
   <style type="text/css">
         @font-face {
            font-family: "Arial"; src: url(sUrl/fonts/Arial.ttf);
        }
        .container {
            font-family: "Arial"
        }
    </style>
</head>
<body>
<div class="container">
    <div class="card">
        <div class="card-header">
            <h3>Skaičiuota - {{ today | date:"d/m/Y" }}</h3>
        </div>  
        <div class="list-group">
            <p>{{ LtPgp }}</p>
            <p>{{ Valstybe }}</p>
            <p>{{ Kastai }}</p>
            <p>{{ Rezultatas }}</p>
        </div>
    </div>
</div>
</body>
</html>

1 Ответ

0 голосов
/ 24 октября 2019

Прочитав кучу более или менее похожих вопросов, я наткнулся на комментарий, рекомендовавший сначала запустить команду py manage.py collectstatic. Прочитав это и проанализировав функцию `link_callback, я нашел решение:

В шаблоне должно быть: font-family: "Arial"; src: "static/fonts/Arial.ttf";

В моем заключении link_callback функция проверяет первую часть ссылки и, если она находитэта ссылка начинается с static, она заменяет ее каталогом на STATIC_ROOT (абсолютный путь). Поскольку я работал на сервере разработки с Debug=True, мне не нужно было collectstatic для всего остального, поэтому, пока все работало, функция link_callback направлена ​​на несуществующий (пока) каталог. После сбора всей статики и исправления ссылки на источник я заработал.

PS Я не профессионал и не имею опыта программирования, поэтому, пожалуйста, исправьте мои предположения, если они не верны (я действительно хочу узнать и узнать больше),Но даже если предположения неверны, код теперь работает нормально.

...