修复 Django 项目中 xhtm2pdf 的类型错误

Posted

技术标签:

【中文标题】修复 Django 项目中 xhtm2pdf 的类型错误【英文标题】:Fixing a type error for xhtm2pdf in a Django Project 【发布时间】:2021-10-16 08:08:37 【问题描述】:

我正在尝试为我的 Django 项目生成 PDF。我用过pip install xhtml2pdf

PDF 是用纯文本生成的,但是当我在 pdf.html 中添加样式时,我得到了这个Exception Type: TypeError

'<' not supported between instances of 'int' and 'NoneType'

这里是views.py:

def admin_order_pdf(request,info_id):
    info = get_object_or_404(Info, id=info_id)
    template_path = 'businessplan/pdf.html'
    context = 'info': info
    # Create a Django response object, and specify content_type as pdf
    response = HttpResponse(content_type='application/pdf')
    # response['Content-Disposition'] = 'attachment; filename="report.pdf"'
    response['Content-Disposition'] = 'filename="order_.pdf"'.format(Info.id)
    # find the template and render it.
    template = get_template(template_path)
    html = template.render(context)

    # create a pdf
    pisa_status = pisa.CreatePDF(html, dest=response)
    # if error then show some funy view
    if pisa_status.err:
       return HttpResponse('We had some errors <pre>' + html + '</pre>')
    return response

这里是pdf.html

% load static %

<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="% static 'css/report.css' %" />
<!--    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">-->

    <title> info.businessName </title>
    <style>

    @charset "UTF-8";
    @font-face 
      font-family: Fira Sans;
      font-weight: 400;
      src: url('/static/img/FiraSans-Regular.otf'); 

    @font-face 
      font-family: Fira Sans;
      font-style: italic;
      font-weight: 400;
      src: url('/static/img/FiraSans-Italic.otf'); 

    @font-face 
      font-family: Fira Sans;
      font-weight: 300;
      src: url('/static/img/FiraSans-Light.otf'); 

    @font-face 
      font-family: Fira Sans;
      font-style: italic;
      font-weight: 300;
      src: url('/static/img/FiraSans-LightItalic.otf'); 

    @font-face 
      font-family: Fira Sans;
      font-weight: bold;
      src: url('/static/img/FiraSans-Bold.otf'); 

    @page 
      @top-left 
        background: #fbc847;
        content: counter(page);
        height: 1cm;
        text-align: center;
        width: 1cm; 

--------------long lines of similar code css----------
      html body article#competences section 
        padding: .5cm 0; 
        html body article#competences section#table-content::before 
          background: url('/static/img/table-content.svg') no-repeat center #fbc847;
          background-size: 50%;
          content: '';
          display: inline-block;
          float: left;
          height: 2cm;
          margin-right: .5cm;
          vertical-align: middle;
          width: 2cm; 
.................. long lines of similar css 
    </style>
    <meta name="description" content="Report example">
  </head>

  <body>
    <article id="cover">
      <h1> info.businessName <br>
      <small>Business Plan <br>
         Created on:  info.date_posted 
      </small>
      </h1>
      <address>
         info.businessName 
         info.businessAddress 
      </address>

我正在寻找类似问题的答案,但我不知道从哪里开始修复。

我知道该错误与 pdf.html 中的 CSS 代码有关,但我不知道为什么会显示。当我删除 pdf 以纯文本显示的样式时。

这是回溯:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\User\Desktop\consultation\businessplan\views.py", line 49, in admin_order_pdf
    pisa_status = pisa.CreatePDF(html, dest=response)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\document.py", line 104, in pisaDocument
    context = pisaStory(src, path, link_callback, debug, default_css, xhtml,
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\document.py", line 67, in pisaStory
    pisaParser(src, context, default_css, xhtml, encoding, xml_output)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\parser.py", line 755, in pisaParser
    context.parseCSS()
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\context.py", line 469, in parseCSS
    self.css = self.cssParser.parse(self.cssText)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\w3c\cssParser.py", line 454, in parse
    src, stylesheet = self._parseStylesheet(src)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\w3c\cssParser.py", line 556, in _parseStylesheet
    src, atResults = self._parseAtKeyword(src)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\w3c\cssParser.py", line 685, in _parseAtKeyword
    src, result = self._parseAtIdent(src)
  File "C:\Users\User\Desktop\consultation\venv\lib\site-packages\xhtml2pdf\w3c\cssParser.py", line 875, in _parseAtIdent
    if semiIdx is not None and semiIdx < blockIdx:
TypeError: '<' not supported between instances of 'int' and 'NoneType'

我不确定css是否是视图导致错误的原因

我的问题:

这个错误的原因是什么,我该如何解决?

谢谢

【问题讨论】:

你能显示整个堆栈跟踪吗? @bdbd 我已经用回溯更新了帖子,谢谢 尝试remove .format(Info.id) @PrOgRaMmEr 同样的错误显示 尝试将您的 css 导出到外部文件。可能是您的 css 有一些难以解析的 xml 字符。您还可以使用 CDATA 部分 【参考方案1】:

删除@charset "UTF-8";

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于修复 Django 项目中 xhtm2pdf 的类型错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 NoReverseMatch Django 错误?

如何在 IntelliJ IDEA 中修复“不支持的类文件主要版本 60”?

添加 list_filter 时,如何在 django modeladmin 更改列表中修复/设置列宽?

如何检查 Django 安全漏洞以及如何修复它们

如何修复 Django:没有返回 HttpResponse 对象。它返回 None 而不是? [复制]

Django静态文件没有加载。修复settings.py以在相对路径上加载文件