Ошибка при рендеринге встроенного PDF с помощью CGI в Python 3.7

#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"