Django - PDF, созданный в Пизе, не имеет пробелов - PullRequest
1 голос
/ 11 сентября 2011

Я использую Django, и мой код для рендеринга PDF действительно типичен:

t = loader.get_template('back/templates/content/receipt.html')
c = RequestContext(request, {
                             'pagesize': 'A4',
                             'invoice': invoice,
                             'plan': plan,
                             })

html = t.render(c)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
if not pdf.err:
    return HttpResponse(result.getvalue(), mimetype="application/pdf")

И в квитанции.html нет ничего необычного:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Squizzal Receipt</title>
    <style type="text/css">
        @page {
            size: {{pagesize}};
            margin: 1cm;
            word-spacing 1cm;
            @frame footer {
                -pdf-frame-content: footerContent;
                bottom: 0cm;
                margin-left: 9cm;
                margin-right: 9cm;
                height: 1cm;
            }
        }
    </style>
</head>
<body>
    <h1>Your Receipt</h1>
   <<SNIP>>

но ни одно из мест в pdf не отображается. Все слова находятся рядом друг с другом. Я пробовал нормальные пробелы и "& nbsp", и результат тот же. Например, приведенное выше будет отображаться как "YourReceipt" в PDF.

Когда я пытаюсь использовать версию pisa для командной строки, она просто генерирует pdf с пробелами между словами.

Есть мысли?

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

У меня была такая же проблема, и я не хотел принудительно загружать PDF из браузера. Это оказалось специфической для платформы проблемой: плагин Google Chrome для просмотра PDF не отображает пробелы в определенных документах в определенных дистрибутивах Linux, если шрифты Microsoft TrueType не установлены. Подробнее см. http://www.google.com/support/forum/p/Chrome/thread?tid=7169b114e8ea33c7&hl=en.

Я исправил это, просто выполнив следующие команды в bash (с учетом вашего дистрибутива; это было в Ubuntu):

$ sudo apt-get install msttcorefonts

(Примите лицензионное соглашение во время процесса установки)

$ fc-cache -fv

После перезапуска Chrome (важно!) Собственный просмотрщик PDF правильно отображал PDF с пробелами.

0 голосов
/ 12 сентября 2011

Хорошо, благодаря akonsu, похоже, проблема в том, как обрабатывается HttpResponse в Django (либо на стороне сервера, либо на стороне браузера).

Вместо

 return HttpResponse(result.getvalue(), mimetype="application/pdf")

Использование:

 resp = HttpResponse(result.getvalue(), mimetype="application/pdf")
 resp['Content-Disposition'] = 'attachment; filename=receipt.pdf'
 return resp

Это как минимум дает результат без пробелов. До сих пор не знаю, почему первый способ не сработал.

...