如何在appengine上用xhtml2pdf生成自定义字体的PDF?

2024-06-17 15:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

xhtml2pdf可以很好地在appengine上生成一个简单的PDF。在

但是现在我需要在生成的PDF中添加一个自定义字体,我似乎找不到一个简单的解决方案来实现这一点。在

我将此CSS添加到HTML中以转换为PDF:

    @font-face {
       font-family: OpenSans;
       src: url("http://mydomain/fonts/Open-Sans-regular.ttf");
    }
    body {
        font-family: OpenSans;
    }

从而产生以下错误:

^{pr2}$

GAE不支持tempfile,因此我尝试在GCS中创建一个临时文件来替换{},如下所示:

self.tmp_file = gcs.open('/gcs_bucket_temp/temp_file', 
                         'w',
                         retry_params=gcs.RetryParams(backoff_factor=1.1))

但是这会造成一些难以修复的破坏性更改:xhtml2pdf对ttfonts.py中的tempfile进行了大量的读取访问(例如。ttfonts.py:321unpack('>L',self._ttf_data[self._pos - 4:self._pos])[0]),这似乎很难迁移到使用GCS文件。在

有没有人能够在appengine上使用xhtml2pdf生成pdf,并使用自定义字体?在


Tags: selfpdf字体ttftempfilefamilytempfile
1条回答
网友
1楼 · 发布于 2024-06-17 15:28:48

下面是我对xhtml2pdf库所做的更改,以便在appengine上允许自定义@font-face支持。基本上是使用GCS来存储tempfile而不是文件系统。在

ttfonts.py:239中,替换:

self.filename, f = TTFOpenFile(f)
self._ttf_data = f.read()

签署人:

^{pr2}$

util.py:608中,替换:

self.tmp_file = tempfile.NamedTemporaryFile()
if self.file:
    shutil.copyfileobj(self.file, self.tmp_file)
else:
    self.tmp_file.write(self.getData())
    self.tmp_file.flush()
return self.tmp_file

签署人:

filename = '/%s/temp_file'%gcs_bucket
self.tmp_file = gcs.open(filename, 'w', retry_params=gcs.RetryParams(backoff_factor=1.1))
if self.file:
    self.tmp_file.write(self.file._fetch_response.content)
else:
    self.tmp_file.write(self.getData())
self.tmp_file.close()
return filename

这似乎起到了作用。自定义字体现在在生成的PDF中显示良好。在

相关问题 更多 >