Django中将TextField导出为PDF - 使用ReportLab时换行变为不可打印字符

2 投票
1 回答
1004 浏览
提问于 2025-04-18 17:59

我有一个模型属性,用来保存用户在HTML文本框中输入的内容。因为当用户在文本框里按下回车键时,表单就会提交,所以我写了一段小的JavaScript代码,自动插入“\n”,这样就能实现换行。

但是,当我尝试使用ReportLab把这个属性导出为PDF时,我看到了一些不可打印的字符,看起来像两个黑色的矩形。当我试着把它们复制到文本编辑器时,它变成了“n”。

这是模型中的代码:

class Package(models.Model):
    content = models.TextField()

这是特定字段的JavaScript和HTML代码:

     <form action="" role="form" method="post">{% csrf_token %}
         <textarea class="form-control" autofocus  name="content">{{content}}</textarea>

            <br/>
     </form>

     <script type="text/javascript">
      $('textarea').keypress(function(event) {
      if (event.which == 13) {
          event.preventDefault();
          var s = $(this).val();
          $(this).val(s+"\n");
      }
      });​
      </script>

这是views.py中的ReportLab代码:

     from reportlab.pdfgen import canvas
     from reportlab.platypus import Spacer
     from reportlab.lib.pagesizes import letter

     def create(pdf):
          packet = StringIO.StringIO()
          can = canvas.Canvas(packet, pagesize=letter)
          p_content = str(package.content)
          textobject = can.beginText(0.5*inch, 4.75*inch)

          for line in p_content:
              textobject.textOut(line)
              if line=="\n":
                  textobject.textLines(p_content)
          can.save()

请帮帮我。我似乎无法解决这个问题。

非常感谢。

1 个回答

0

我得到了外部的帮助,所以我就把这个内容发在这里,供有兴趣的人参考。

问题出在这行代码上:

      for line in p_content:
          textobject.textOut(line)
          if line=="\n":
              textobject.textLines(p_content)
      can.save()

我在检查转义字符之前就打印出来了。正确的代码应该是:

for c in p_content:
    if c == '\n':
        textobject.textLine()
    elif c == '\r':
        pass # do nothing
    else:
        textobject.textOut(c)

撰写回答