Is there a way to generate pdf containing non-ascii symbols with pisa from django template?

后端 未结 6 794
情歌与酒
情歌与酒 2021-02-05 08:11

I\'m trying to generate a pdf from template using this snippet:

def write_pdf(template_src, context_dict):
    template = get_template(template_src)
    context          


        
相关标签:
6条回答
  • 2021-02-05 08:32

    I am using xhtml2pdf version 0.2.4 I faced the same issue and I was able to resolve using this encoding:

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

    Then in my views, I have defined like:

    def download_pdf(request, pk):
    item = get_object_or_404(object, id=pk)
    if item:
        context ={
            'item': item
        }
        template_name = 'template.html'
        pdf = render_to_pdf(template_name, context)
        return HttpResponse(pdf, content_type='application/pdf')
    
    else:
        messages.info(request, 'Item not found')
        return redirect('home')
    

    My HTML:

    {% load static %}
    {% load humanize %}
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
        <link rel="icon" type="image/gif" href="{% static 'images/profile.png' %}" />
        <title>{{ item.scientific_name}}</title>
        <link rel="stylesheet" href="{% static 'style/Bootstrap/css/bootstrap.min.css' %}">
    
       <style>
        @page {
            size: letter;
            margin: 2cm;
    
            @frame footer_frame {
                /* Another static Frame */
                -pdf-frame-content: footer_content;
                left: 50pt;
                width: 512pt;
                top: 760pt;
                height: 50px;
            }
    
            table {
                -pdf-keep-with-next: true;
            }
        }
    
        ul {
            list-style-type: none;
        }
    
        ul li span {
            font-weight: bold;
        }
    </style>
    
    0 讨论(0)
  • 2021-02-05 08:38

    You need to modify your django template. Add a new font face in the stylesheet that will link to a font file with characters used in your document. And that font file must be accessible from your server (under Ubuntu you can find files with fonts in /usr/share/fonts/truetype/ directory). For example:

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

    Then if you have next HTML code:

    <div>Some non-latin characters</div>
    

    you can display that text in DejaMono font with this CSS rule:

    div { font-family: DejaMono; }
    

    This works for me when I generate PDF documents with cyrillic characters.

    0 讨论(0)
  • 2021-02-05 08:42

    Try replacing

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
    

    with

    pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')
    

    Or checkout this answer to html to pdf for a Django site?

    0 讨论(0)
  • 2021-02-05 08:44

    I faced the same problem with cyrillic characters.

    The solution contained two steps: 1. Point out the font file in your HTML file

    <style type="text/css">
    @font-face {
      font-family: Arial; src: url("files/arial.ttf");
    }
    body {
      font-family: Arial;
    }
    </style>
    

    2. Give "pisa" root path (so that it find font file by relative path) in my case it was something like this

    pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT)
    

    because fonts were placed at PATH_TO_DJANGO_PROJECT/files/arial.ttf

    0 讨论(0)
  • 2021-02-05 08:48

    This does work for me:

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')
    
    0 讨论(0)
  • 2021-02-05 08:50

    If you are calling createPDF instead of the pisaDocument method, you can use

    pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')
    
    0 讨论(0)
提交回复
热议问题