#apache #cgi #python-3.7
#apache #cgi #python-3.7
Вопрос:
При выполнении скрипта с 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 amp;#8804; 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('nn')
sys.stdout.flush()
sys.__stdout__.buffer.write(packet.getvalue())
PDF извлекается при непосредственном запуске скрипта модулем when.
Ошибка при импорте в другом модуле Ошибка в apache errorlogs: неверно сформированный заголовок из скрипта. Неверный заголовок =%PDF-1.3:
Спасибо вам,
Ответ №1:
Предположение от парня, не владеющего python:
print('Content-type: application/pdf')
print('Content-Disposition: inline; filename="out.pdf"')
print('nn')
выглядит подозрительно: после каждого HTTP-заголовка требуется перевод строки:
print('Content-type: application/pdf')
print('n')
print('Content-Disposition: inline; filename="out.pdf"')
print('nn')
Как вы говорите, вы видите «искаженный заголовок из скрипта» в журналах: следите за ними. Я предполагаю, что версия без дополнительного разрыва строки просто имеет Content-Type
заголовок с действительно странным типом содержимого:
Content-type: application/pdfContent-Disposition: inline; filename="out.pdf"
в то время как браузер (и сервер) могли (и должны) использовать
Content-type: application/pdf
Content-Disposition: inline; filename="out.pdf"