返回

HTML转PDF中的痛处与收获

后端

转HTML到PDF,网上有很多介绍,不过我的这次尝试,是一连串的问题与条件。

第一步,访问一个接口获取HTML并且转PDF,不能用插件,服务器不能装。对此,我用了下面这个方案:

```
from io import BytesIO
from xhtml2pdf import pisa
import requests

# 用 pip install xhtml2pdf 命令安装库

url = 'http://example.com'
response = requests.get(url)

# 将HTML字符串放在BytesIO对象里,BytesIO模拟了一个二进制文件
bio = BytesIO(response.content)

# 最终储存的PDF文件的地址
pdf_filename = 'your_file.pdf'

pdf = pisa.pisaDocument(bio, file(pdf_filename, "wb"))
if not pdf.err:
    print("转换完成!")
```

第二步,HTML并不符合XML标准,用XML解析器(render)肯定不合适,但我依然成功实现了HTML的解析,办法是利用正则表达式提取HTML里的内容,见下面例子:

```
import re

def cleanhtml(raw_html):
    cleanr = re.compile('<.*?>')
    cleantext = re.sub(cleanr, '', raw_html)
    return cleantext
```

第三步,既然用不上XML解析,当然也就不适合用XML解析器来把HTML转成PDF了,这倒不是什么大问题,cStringIO模块提供了StringIO对象,我们完全可以用StringIO对象实现和BytesIO对象一样的功能。

```
from cStringIO import StringIO

# ... 前面代码

bio = StringIO()
pdf = pisa.pisaDocument(bio, file(pdf_filename, "wb"))

# ... 后面代码
```

这之后,无论遇到什么问题,都不过是常规的PDF生成中遇到的问题罢了,也不足为奇了。