Python3.6 CGI环境下PDF文件加载失败问题求助
解决Python 3.6中输出PDF文件时“Failed to load PDF document”的问题
你猜得没错!问题确实出在Python 3.6对字节字符串的打印行为上。在Python 3.2里,print()遇到bytes对象时会直接输出原始二进制数据,但从Python 3.3开始,print()会把bytes对象转换成它的repr形式——也就是自动加上b'前缀和'后缀。这就导致浏览器收到的内容里混了这些额外字符,自然无法正确解析PDF文件了。
给你两个简单有效的解决方法:
方法一:用sys.stdout.write()直接输出字节
这是最可靠的方式,因为sys.stdout.write()可以直接写入二进制数据,不会做任何额外的格式化处理:
#!/usr/bin/python3 import sys with open('sol.pdf', 'rb') as fp: # 先输出HTTP响应头,直接用字节字面量更简洁 sys.stdout.write(b"Content-type: application/pdf\n\n") # 直接写入PDF的二进制内容 sys.stdout.write(fp.read())
方法二:切换标准输出为二进制模式(适合纯二进制输出场景)
如果你的代码需要大量输出二进制内容,可以把标准输出切换成二进制模式,避免频繁的类型转换:
#!/usr/bin/python3 import sys # 将标准输出切换为二进制模式,后续直接写入字节即可 sys.stdout = sys.stdout.detach() with open('sol.pdf', 'rb') as fp: sys.stdout.write(b"Content-type: application/pdf\n\n") sys.stdout.write(fp.read())
注意:切换后标准输出就无法再输出字符串了,适合专门处理二进制输出的场景。
核心思路就是避开print()对字节数据的格式化处理,直接操作标准输出的字节流,这样浏览器就能收到完整且正确的PDF二进制数据,顺利加载文件了。
内容的提问来源于stack exchange,提问作者Toby Hall
相关产品推荐
相关产品推荐

