PDF-файл, созданный с помощью ReportLab, не откроется в Adobe Acrobat; «Ожидался объект dict».

#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()