2013-08-04 32 views
2

我正在寫一個應用程序,其結果與一些文本與Unicode字符的PDF文件。在GAE devserver上效果很好,但部署後無法導入字體文件(在add_font()(pyfpdf)之後崩潰)。Unicode格式的PDF在GAE與web2py/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 ...)是在/膠子/了contrib/FPDF /字體。我沒有添加任何東西到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ąśł') 

但是,如果沒有「不尋常」的字符...

最好的解決辦法是添加我的字體文件(如幻覺記憶),但基本上我需要Unicode字符在任何字體......也許一些「半解決方案」使用「通用GAE unicode」字體...如果它存在這樣的東西...

+0

我會看看解決不安全的醃製錯誤。這通常是由開放的'rb'與'w'不匹配造成的,其中一個以二進制格式打開。 –

回答

0

謝謝你的建議蒂姆!

我發現some solution ...這是不是最好的,但它的工作原理...

的問題是使用GAE上的泡菜。最好的解決方案(可能)是超載/重寫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。