【问题标题】:Is there a way to generate pdf containing non-ascii symbols with pisa from django template?有没有办法从 django 模板生成包含非 ascii 符号的 pdf?
【发布时间】:2010-12-10 20:51:16
【问题描述】:

我正在尝试使用此 sn-p 从模板生成 pdf:

def write_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
    if not pdf.err:
        return http.HttpResponse(result.getvalue(), mimetype='application/pdf')
    except Exception('PDF error')

所有非拉丁符号均未正确显示,模板和视图使用 utf-8 编码保存。

我尝试将视图保存为 ANSI,然后保存到用户 unicode(html,"UTF-8"),但它会抛出 TypeError。

我还以为可能是因为默认字体不支持 utf-8 所以根据 pisa 文档,我尝试在样式部分的模板正文中设置字体。

那仍然没有结果。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: python django pdf pisa


    【解决方案1】:
    【解决方案2】:

    尝试替换

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

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

    或查看html to pdf for a Django site?的答案

    【讨论】:

    • 在替换得到的pdf充满了不可读的数据后,检查了解决方案,该方法与我使用的方法没有太大区别,但我仍然对其进行了测试,使用 html.encode("ISO-8859-1 ”)它抛出:“'latin-1'编解码器无法在位置0编码字符u'\ufeff':序数不在范围(256)”与encode(“UTF-8”)它返回pdf但与相同我以前得到过 - 非 ascii 符号仍未正确呈现。
    • @mihailt 你找到解决方案了吗?
    • 正好加上这个:encoding='UTF-8' 解决了我的波兰字符编码问题
    【解决方案3】:

    您需要修改您的 django 模板。在样式表中添加一个新字体,该字体将链接到包含文档中使用的字符的字体文件。并且该字体文件必须可以从您的服务器访问(在 Ubuntu 下,您可以在 /usr/share/fonts/truetype/ 目录中找到带有字体的文件)。例如:

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

    如果你有下一个 HTML 代码:

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

    您可以使用此 CSS 规则以 DejaMono 字体显示该文本:

    div { font-family: DejaMono; }
    

    当我生成带有西里尔字符的 PDF 文档时,这对我有用。

    【讨论】:

      【解决方案4】:

      我遇到了同样的西里尔字符问题。

      解决方案包含两个步骤: 1.指出你的HTML文件中的字体文件

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

      2。给出“pisa”根路径(以便它通过相对路径找到字体文件) 在我的情况下是这样的

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

      因为字体被放置在 PATH_TO_DJANGO_PROJECT/files/arial.ttf

      【讨论】:

        【解决方案5】:

        如果你调用 createPDF 而不是 pisaDocument 方法,你可以使用

        pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')
        

        【讨论】:

          【解决方案6】:

          我正在使用 xhtml2pdf 版本 0.2.4 我遇到了同样的问题,我能够使用这种编码来解决:

          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
          

          然后在我看来,我定义为:

          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')
          

          我的 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>
          

          【讨论】:

            猜你喜欢
            • 2012-03-20
            • 2013-06-17
            • 1970-01-01
            • 2017-12-20
            • 2021-08-26
            • 1970-01-01
            • 2019-08-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多