首页 > 解决方案 > 在 Python 3.7 中使用 CGI 渲染内联 PDF 时出错

问题描述

当使用 python CGI PDF 执行脚本时,它的提取效果很好。但是如果我在另一个模块中导入脚本无法获取 pdf。

import cgi
form = cgi.FieldStorage()

import os,io,html,sys
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
data  = 'Create a new PDF with Reportlab Swamy® RedteK 4104      DE*    ≤     0.4       ≤ 1.5     *'

packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
strdata = data.encode('utf-8','xmlcharrefreplace')
cat = str(html.unescape(strdata.decode()))
can.drawString(10, 500, cat)
can.showPage()
can.save()
packet.seek(0) 

print('Content-type: application/pdf')
print('Content-Disposition: inline; filename="out.pdf"')

print('\n\n')
sys.stdout.flush()
sys.__stdout__.buffer.write(packet.getvalue())

直接启动脚本时模块获取 PDF。 在此处输入图像描述

在另一个模块中导入时出错 apache 错误日志中的错误:脚本中的标头格式错误。错误的标题=%PDF-1.3:

谢谢,

标签: apachecgipython-3.7

解决方案


来自非 python 人的猜测:

print('Content-type: application/pdf')
print('Content-Disposition: inline; filename="out.pdf"')

print('\n\n')

看起来很可疑:每个 HTTP 标头后都需要换行:

print('Content-type: application/pdf')
print('\n')
print('Content-Disposition: inline; filename="out.pdf"')

print('\n\n')

正如您所说,您在日志中看到“脚本中的错误标头”:监视它们。我假设没有额外换行符的版本只是具有Content-Type非常奇怪的内容类型的标题:

Content-type: application/pdfContent-Disposition: inline; filename="out.pdf"

而浏览器(和服务器)可以(并且应该)利用

Content-type: application/pdf
Content-Disposition: inline; filename="out.pdf"

推荐阅读