[英]Unicode fonts in pdf at GAE with web2py/pyfpdf
我正在编写一个应用程序,该应用程序将生成带有一些带有unicode字符的文本的pdf文件。 在GAE devserver上,它运行良好,但部署后无法导入字体文件(在add_font()(pyfpdf)之后崩溃)。
代码是:
# -*- coding: utf-8 -*-
def fun1():
from gluon.contrib.pyfpdf import FPDF, HTMLMixin
class MyFPDF(FPDF, HTMLMixin):
pass
pdf =MyFPDF()
pdf.add_font('DejaVu', '', 'DejaVuSansCondensed.ttf', uni=True)
pdf.add_page()
pdf.set_font('DejaVu','',16)
pdf.write(10,'test-ąśł')
response.headers['Content-Type']='application/pdf'
return pdf.output(dest='S')
字体文件(在Web2py服务器上首次运行后生成的文件DejaVuSansCondensed.pkl ...)位于/ gluon / contrib / fpdf / font中。 我没有向routers.py添加任何内容(我使用的是基于模式的系统),app.yaml也没有更改。 我得到这个:
In FILE: /base/data/home/apps/s~myapp/web2py-04.369240954601780983/applications/app3/controllers/default.py
Traceback (most recent call last):
File "/base/data/home/apps/s~myapp/web2py-04.369240954601780983/gluon/restricted.py", line 212, in restricted
exec ccode in environment
File "/base/data/home/apps/s~myapp/web2py-04.369240954601780983/applications/app3/controllers/default.py", line 674, in <module>
File "/base/data/home/apps/s~myapp/web2py-04.369240954601780983/gluon/globals.py", line 194, in <lambda>
self._caller = lambda f: f()
File "/base/data/home/apps/s~myapp/web2py-04.369240954601780983/applications/app3/controllers/default.py", line 493, in fun1
pdf.add_font('DejaVu', '', 'DejaVuSansCondensed.ttf', uni=True)
File "/base/data/home/apps/s~myapp/web2py-04.369240954601780983/gluon/contrib/fpdf/fpdf.py", line 432, in add_font
font_dict = pickle.load(fh)
File "/base/data/home/runtimes/python27p/python27_dist/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/pickle.py", line 966, in load_string
raise ValueError, "insecure string pickle"
ValueError: insecure string pickle
正如我在本地(web2py / rocket和gae)上所说的那样,它运作良好。 部署后,只有这样的作品:
pdf =MyFPDF()
pdf.add_page()
pdf.set_font('Arial','',16)
pdf.write(10,'testąśł')
但是没有“异常”字符...
最好的解决方案是添加我的字体文件(例如DejaVu),但是基本上我需要任何字体的unicode字符...也许有些“半解法”才能使用“通用GAE unicode”字体...如果存在类似的东西这个...
谢谢提姆的建议!
我找到了一些解决方案 ...这不是最好的解决方案 ,但是它可以工作...
问题在于在GAE上使用pickle。 最好的解决方案(可能)是重载/重写add_font()
函数(对于GAE),以这种方式,它将写入数据存储区而不是文件系统。 ValueError: insecure string pickle
错误仍然可能发生,我根据this尝试了b64编码。 但是我仍然会出错。 所以我的解决方案是用注释掉/删除的部分重载add_font()
函数:
if os.path.exists(unifilename):
fh = open(unifilename)
try:
font_dict = pickle.load(fh)
finally:
fh.close()
else:
和
try:
fh = open(unifilename, "w")
pickle.dump(font_dict, fh)
fh.close()
except IOError, e:
if not e.errno == errno.EACCES:
raise # Not a permission error.
因此,该函数每次只计算更多的数据,而不仅仅是从泡菜中读取数据...但是它在GAE上有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.