91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法

Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法

發布時間:2020-08-22 13:41:47 來源:腳本之家 閱讀:240 作者:Pykk2019 欄目:開發技術

項目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master

這個demo實現了通過用戶輸入自己的個人信息生成一份簡歷pdf,來闡述如何使用Django的HttpResponse生成PDF的文檔。

先上效果圖:

Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法

Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法

Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法

安裝依賴庫

首先安裝Django最新版2.2.2和PDF依賴包xhtml2pdf

pip install django
pip install xhtml2pdf

編寫表單驗證

為了簡單起見,這個demo依賴數據庫,只需要表單驗證數據即可

pdf/forms.py

class MessageForm(forms.Form):
  '''
  表單驗證
  '''
  name = forms.CharField(required=True)
  degree = forms.CharField(required=True)
  edu = forms.CharField(required=True)
  work = forms.CharField(required=True)
  tech = forms.CharField(required=True)
  phone = forms.CharField(required=True)

編寫類視圖

pdf/views.py

由于這里我們只需要表單視圖,所以只創建了一個類視圖,post用來驗證表單數據是否都存在,如果存在就把表單數據渲染到PDF模板中,經過處理后返回PDF的響應response。

這里可以使用Django的通用類視圖FormView構建,代碼更簡潔

class MessageView(View):
  def get(self, request):
    form = MessageForm(data=request.GET)
    return render(request, 'index.html', {
      'form': form
    })

  def post(self, request):
    form = MessageForm(data=request.POST)
    if form.is_valid():
      response = generate_pdf_response(context=form.cleaned_data)
      return response
    return redirect(reverse('pdf:message'))

編寫生成PDF響應response

view.py這里為了方便直接把處理函數寫到視圖函數的文件里

def link_callback(uri):
  if uri.startswith(settings.MEDIA_URL):
    path = os.path.join(settings.MEDIA_ROOT,
              uri.replace(settings.MEDIA_URL, ""))
  elif uri.startswith(settings.STATIC_URL):
    path = os.path.join(settings.STATIC_ROOT,
              uri.replace(settings.STATIC_URL, ""))
  else:
    return uri

  # 確保本地文件存在
  if not os.path.isfile(path):
    raise Exception(
      "Media URI 必須以以下格式開頭"
      f"'{settings.MEDIA_URL}' or '{settings.STATIC_URL}'")

  return path


def generate_pdf_response(context):
  response = HttpResponse(content_type="application/pdf")
  response["Content-Disposition"] = \
    f"attachment; filename='{context['name']}.pdf'"

  html = render_to_string("pdf.html", context=context)
  status = pisa.CreatePDF(html,
              dest=response,
              link_callback=link_callback)

  if status.err:
    return HttpResponse("PDF文件生成失敗")
  return response

解決中文亂碼問題

需要下載中文字體msyh.ttf放在static目錄下的font目錄,用來設置全局字體。這些文件都在github倉庫里。

def font_patch():
  from reportlab.pdfbase.ttfonts import TTFont
  from reportlab.pdfbase import pdfmetrics
  from xhtml2pdf.default import DEFAULT_FONT
  pdfmetrics.registerFont(TTFont('yh', '{}/font/msyh.ttf'.format(
    settings.STATICFILES_DIRS[0])))
  DEFAULT_FONT['helvetica'] = 'yh'

把這個函數放在生成PDF響應前

Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法

按照以上大致步驟大家就能夠生成PDF文件了,可以在網頁中瀏覽、放大、縮小,也可以下載,非常方便、簡單。

大家可以直接clone一份代碼試試效果

以上這篇Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高密市| 平泉县| 阳西县| 武平县| 连江县| 全南县| 二连浩特市| 黄石市| 柏乡县| 彰化县| 保靖县| 五大连池市| 南汇区| 广丰县| 仁怀市| 章丘市| 秀山| 南京市| 衡阳县| 正定县| 无棣县| 台南市| 贵德县| 陈巴尔虎旗| 青田县| 浑源县| 新绛县| 隆尧县| 普兰县| 光山县| 保靖县| 北辰区| 尼勒克县| 晋宁县| 巢湖市| 社会| 彰化市| 揭东县| 台东市| 龙南县| 青河县|