问题描述
我想生成不同语言的PDF报告。 我遵循了使用TTFont的不同指南。 我尝试了不同的语言,但没有人在工作。
例如,对于俄语,我使用:
self.buffer = BytesIO()
self.pdf_data = []
pdfmetrics.registerFont(TTFont('DejaVuSerif',self.font_dir + 'dejavuserif/DejaVuSerif.ttf'))
font_name = "DejaVuSerif"
self.styles = getSampleStyleSheet()
self.styles.add(ParagraphStyle(name = "HeaderTitle",parent = self.styles['Title'],alignment = TA_CENTER,fontName=font_name))
doc = SimpleDocTemplate(self.buffer)
self.pdf_data.append(Paragraph('Операции - Отчет Август 2020 г.',self.styles['HeaderTitle']))
doc.build(self.pdf_data)
pdf = self.buffer.getvalue()
self.buffer.close()
但是输出是:
€•,ƒ„…††-€‡ˆ,‡„‰Š‹Œ‡2020Š。
我做错了什么?
ReportLab版本= 3.5.50
更新
我想指出的是,该文件在语言环境中是正确的,但是当我附加响应时,问题仍然存在。
return flask.send_from_directory(file_path,filename,mimetype="application/pdf",as_attachment=True,attachment_filename=filename,cache_timeout=0)
解决方法
您显示的代码部分看起来不错。在变量“ pdf”中,您将获取PDF的字节。
可以用烧瓶响应返回字节,如下所示:
@app.route('/')
def gen_pdf():
pdf_util = PDFUtil()
pdf_bytes = pdf_util.generate()
response = make_response(pdf_bytes)
response.headers.set('Content-Type','application/pdf')
return response
请注意,Content-Type
标头需要设置为:application/pdf
。如果您希望浏览器下载PDF文件而不是内联显示,则可以添加其他标题,例如:
response.headers.set('Content-Disposition','attachment',filename='test.pdf')
因此,如果字体合适,并且您以内容类型application/pdf
返回这些字节,则正确的结果将显示在浏览器中。
我只对您的代码进行了少许修改,将其保存在名为pdf_flask_demo.py
的python脚本中,以获取包含flask响应部分的独立示例:
from io import BytesIO
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.styles import ParagraphStyle,getSampleStyleSheet
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import SimpleDocTemplate,Paragraph
from flask import Flask,make_response
app = Flask(__name__)
@app.route('/')
def gen_pdf():
pdf_util = PDFUtil()
pdf_bytes = pdf_util.generate()
response = make_response(pdf_bytes)
response.headers.set('Content-Type','application/pdf')
return response
class PDFUtil:
def __init__(self):
self.font_dir = "./"
def generate(self):
self.buffer = BytesIO()
self.pdf_data = []
pdfmetrics.registerFont(TTFont('DejaVuSerif',self.font_dir + 'dejavuserif/DejaVuSerif.ttf'))
font_name = "DejaVuSerif"
self.styles = getSampleStyleSheet()
self.styles.add(
ParagraphStyle(name="HeaderTitle",parent=self.styles['Title'],alignment=TA_CENTER,fontName=font_name))
doc = SimpleDocTemplate(self.buffer)
self.pdf_data.append(Paragraph('Операции - Отчет Август 2020 г.',self.styles['HeaderTitle']))
doc.build(self.pdf_data)
pdf = self.buffer.getvalue()
self.buffer.close()
return pdf
替代
一个人还可以将PDF文件保存在本地文件系统中,然后将其返回flask.send_from_directory
。在PDF浏览器中打开后,在用户浏览器上下载的PDF也可以正确显示。
@app.route('/')
def gen_pdf():
pdf_util = PDFUtil()
pdf_bytes = pdf_util.generate()
f = open('/Users/stephan/tmp/mytest.pdf','wb')
f.write(pdf_bytes)
f.close()
return flask.send_from_directory('/Users/stephan/tmp/','mytest.pdf',mimetype="application/pdf",as_attachment=True,attachment_filename='mytest.pdf',cache_timeout=0)
测试
我在命令行上致电:
export FLASK_APP=pdf_flask_demo
export FLASK_ENV=development
flask run
在浏览器中使用http://127.0.0.1:5000
时,我得到了预期的结果: