【问题标题】:Unicode fonts in pdf at GAE with web2py/pyfpdf使用 web2py/pyfpdf 在 GAE 的 pdf 中的 Unicode 字体
【发布时间】:2013-08-04 16:40:56
【问题描述】:

我正在编写一个应用程序,结果是 pdf 文件和一些带有 unicode 字符的文本。在 GAE 开发服务器上运行良好,但部署后无法导入字体文件(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”字体......如果它存在这样的东西......

【问题讨论】:

  • 我会考虑解决不安全的泡菜错误。这通常是由于打开 'rb' 与 'w' 不匹配造成的,一个以 ascii 模式打开,另一个以二进制模式打开。

标签: google-app-engine pdf web2py


【解决方案1】:

感谢蒂姆的建议!

我找到了some solution...它不是最好的,但它有效...

问题在于在 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。

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 2013-02-18
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2018-04-22
    • 2012-07-04
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多