亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 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

仪陇县| 唐河县| 思南县| 芦山县| 右玉县| 留坝县| 仁怀市| 米脂县| 望城县| 池州市| 临澧县| 黑河市| 建宁县| 吴堡县| 天柱县| 九台市| 五家渠市| 梁平县| 汕尾市| 东兴市| 常山县| 甘洛县| 温泉县| 乌什县| 婺源县| 金湖县| 岳西县| 金乡县| 东安县| 龙岩市| 博乐市| 色达县| 辰溪县| 连山| 方城县| 武陟县| 盐山县| 台东市| 岳阳县| 九江县| 东阿县|