#python #pdf #pdf-generation #reportlab #platypus
Вопрос:
Я создаю довольно простой отчет с помощью ReportLab. В нем есть немного текста, около пятнадцати небольших изображений и некоторые пользовательские метаданные. Он отлично генерируется и открывается в Chrome или Edge, но не открывается в Acrobat или Reader. При открытии в одном из последних двух он говорит, что «Ожидал объект dict», а затем просто выводит пустой белый квадрат для каждой страницы.
Я вообще не использую утконоса, просто reportlab.pdfgen.canvas. Я помещу анонимизированную версию кода здесь. Кроме того, я довольно новичок в программировании в целом, поэтому, пожалуйста, не судите о моих ошибках новичка (например, буквально устанавливая переменную i для увеличения; даже я знаю, что человек ленив (а также, пожалуйста, игнорируйте, что таблицы являются изображениями; это из-за…причин)).
from datetime import datetime
from reportlab.pdfgen import canvas
import pdf_report_utils as pu
import plotly.graph_objects as go
def create_pdf_canvas(year_int, month_int):
# Create PDF and give PDF a document title
start_as_date = datetime. strptime(start, '%Y-%m-%d %H:%M:%S')
month_name = start_as_date.strftime('%B')
year_name = start_as_date.strftime('%Y')
pdf = canvas.Canvas('pdfs/OSP Monthly Summary Report DRAFT - '
year_name ' ' month_name '.pdf',
pagesize='letter'
)
pdf.setTitle('Company Inc Monthly Summary Report')
# Setting metadata
pdf.setAuthor("Someone via ReportLab in Python")
pdf.setTitle("Company Inc Monthly Summary Report DRAFT - "
year_name " " month_name)
pdf.setSubject("An auto-generated report of various data.")
# Making title backdrop
pdf.setFillColorRGB(237/256,238/256,239/256)
pdf.rect(0, 660, 750, 300, stroke=0, fill=1)
# Making title
pdf.setFillColorRGB(118/256,168/256,53/256)
pdf.setFontSize(size=32)
pdf.drawString(50, 700, 'Company Inc')
pdf.setFillColorRGB(0,0,0)
pdf.drawString(125, 700, 'Monthly Summary Report')
# Making subtitle
pdf.setFontSize(size=14)
pdf.drawString(50, 680, f'For {month_name}, {year_name}')
# Making section header
pdf.setFontSize(size=18)
pdf.drawString(50, 630, 'Summary Tables')
#Drawing all of the tables
pdf.setFontSize(size=10)
px = 610
i = 0
for title in section_titles:
# If statement checks to see if it should loop to next page
if i 1 <= len(section_titles): # This keeps it within the list dims
if px - section_title_height - table_height[i]/2 < 50:
pdf.showPage()
pdf.setFontSize(size=14)
pdf.drawString(50, 700, 'Summary Tables (cont.)')
pdf.setFontSize(size=10)
px = 680 # resetting px to top of page
px = px - section_title_height
pdf.drawString(50, px, title)
px = px - table_height[i]/2 - 5
pdf.drawImage('images/table' str(i 1) '.jpg',
50, px, 510, table_height[i]/2)
i = i 1
#=============Charts Page 1============
pdf.showPage() #New page, charts added in next lines
pdf.drawImage('images/chart1.jpg', 50, 400, 510, 300)
pdf.drawImage('images/chart2.jpg', 50, 50, 510, 300)
pdf.setFontSize(size=18)
pdf.drawString(50, 700, 'Summary Charts')
#=============PAGE 3============
pdf.showPage() #New page, charts added in next lines
pdf.drawImage('images/chart3.jpg', 50, 400, 510, 300)
pdf.drawImage('images/chart4.jpg', 50, 50, 510, 300)
# #=============PAGE 4============
# pdf.showPage() #New page, charts added in next lines
# pdf.drawImage('images/chart5.jpg', 50, 400, 510, 300)
# pdf.drawImage('images/chart6.jpg', 50, 50, 510, 300)
# Saving PDF
pdf.save()