2009-12-03 26 views
10

Tôi đang thực hiện chương trình đầu tiên của mình bằng ReportLab, nơi tôi không biết trước khi ngắt trang sẽ giảm và tôi đang gặp sự cố. Để giữ cho mọi thứ đơn giản, tôi đang sử dụng SimpleDocTemplate. flowables của tôi giống như thế này:ReportLab LayoutError: quá lớn trên trang

flowables = [Paragraph("Some title", style=headerParagraphStyle), 
      Spacer(0, 10), 
      Paragraph("first paragraph", style=bodyParagraphStyle), 
      Paragraph("second paragraph", style=bodyParagraphStyle), 
      ... 
      Paragraph("nth paragraph", style=bodyParagraphStyle), 
      PageBreak(), 
      Paragraph("Some title", style=headerParagraphStyle), 
      Spacer(0, 10), 
      Paragraph("first paragraph", style=bodyParagraphStyle), 
      Paragraph("second paragraph", style=bodyParagraphStyle), 
      ... 
      Paragraph("mth paragraph", style=bodyParagraphStyle), 
      PageBreak(), 
      ...] 

Khi tôi xây dựng PDF tất cả mọi thứ của tôi đi tốt chừng nào tôi n hoặc m hay tuy nhiên nhiều đoạn cơ thể phù hợp trên một trang, nhưng nếu họ chạy qua, tôi nhận được một lỗi như như sau:

reportlab.platypus.doctemplate.LayoutError: Flowable <Paragraph at 0xb79800 frame=normal>20th paragraph: too large on page 3 

Dường như không tìm được lý do chính đáng cho việc này xảy ra với tôi. Bất kỳ đề xuất? Nó làm điều này ngay cả khi tôi loại bỏ các PageBreaks(). Tất cả các đoạn văn là tương đối ngắn, chủ yếu là ít hơn một câu/dòng trên.

ETA: Tôi đăng tất cả mã (với số nhận dạng nhỏ bị tước) đang tạo lỗi cho tôi. Tôi đã chuyển đổi nó để đọc một tập tin CSV, vì vậy tôi đã đăng nội dung của nó, quá. Các lỗi chính xác rằng mã này tạo ra cho tôi khi tôi chạy nó là:

việc
 
Traceback (most recent call last): 
    File "./spice_dev.py", line 355, in 
    departmentReportDoc.build(eachDepartment.report, onFirstPage=onReportPage, onLaterPages=onReportPage) 
    File "/usr/local/lib/python2.6/site-packages/reportlab/platypus/doctemplate.py", line 1010, in build 
    BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker) 
    File "/usr/local/lib/python2.6/site-packages/reportlab/platypus/doctemplate.py", line 777, in build 
    self.handle_flowable(flowables) 
    File "/usr/local/lib/python2.6/site-packages/reportlab/platypus/doctemplate.py", line 694, in handle_flowable 
    raise LayoutError(ident) 
reportlab.platypus.doctemplate.LayoutError: Flowable Additional comments and suggestions for improvement: too large on page 3 

Một số lỗi cho thấy rằng lỗi là kết quả của đoạn này (mặc dù nó có thể được flowables khác, tùy thuộc vào chiều dài nội dung) cố gắng để chia nhỏ, bị trì hoãn, và sau đó vẫn không thể tách rời sau khi gọi đến handle_frameEnd(). Gợi ý?

spice.py:

#!/usr/local/bin/python 
# vim: set fileencoding=latin-1 

#import csv 
import os 
import os.path 
import time 

import numpy 
import scipy.stats._support 

#for debugging 
import sys 
import traceback 

# imports for reportlab 

from reportlab.platypus import * 
from reportlab.lib.styles import ParagraphStyle 
from reportlab.lib.pagesizes import LETTER, landscape, portrait 
from reportlab.lib.units import inch 
from reportlab.lib import colors 
from reportlab.pdfgen import canvas 
from reportlab.lib.enums import * 

########################## 
####### Constants ######## 
########################## 

kNumberOfQuestions = 4 

########################## 
####### Reportlab ######## 
########################## 

def _doNothing(canv, doc): 
    pass 

headerParagraphStyle = ParagraphStyle("Header", fontName="Helvetica-Bold", fontSize=16, spaceAfter = .05*inch, alignment=TA_CENTER) 
header2ParagraphStyle = ParagraphStyle("Header2", fontName="Helvetica-Bold", fontSize=14, spaceAfter = .1*inch, spaceBefore=.5*inch, alignment=TA_CENTER) 
subheaderInfoParagraphStyle = ParagraphStyle("Subheader Info", fontName="Helvetica-Bold", fontSize=10, alignment=TA_CENTER) 
questionParagraphStyle = ParagraphStyle("Question header", fontName="Helvetica-Bold", fontSize = 10, alignment=TA_LEFT) 
commentParagraphStyle = ParagraphStyle("Comment", fontName="Helvetica", fontSize = 10, alignment=TA_LEFT) 
instructorParagraphStyle = ParagraphStyle("Instructor Header", fontName="Helvetica", fontSize=10, alignment=TA_LEFT) 
basicTableStyle = TableStyle(
     [('FONT', (0, 0), (-1, 0), 'Helvetica-Bold', 9), 
     ('ALIGN', (0, 0), (-1, 0), 'CENTER'), 
     ('LINEBELOW', (0, 0), (-1, 0), 1, colors.black), 
     ('INNERGRID', (0, 0), (-1, 0), 1, colors.black), 
     ('FONT', (0, 1), (-1, -1), 'Helvetica', 9), 
     ('ALIGN', (0, 1), (-1, 1), 'LEFT'), 
     ('ALIGN', (1, 1), (-1, -1), 'CENTER'), 
     ('LINEAFTER', (0, 1), (0, -1), 1, colors.black), 
     ('LINEBEFORE', (1, 1), (-1, -1), 1, colors.black), 
     ('ROWBACKGROUNDS', (0, 1), (-1, -1), (colors.white, (.9, .9, .9))), 
     ('TOPPADDING', (1, 1), (-1, -1), 8) 
     ]) 
statTableStyle = TableStyle(
     [('FONT', (0, 0), (0, -1), 'Helvetica-Bold', 9), 
     ('ALIGN', (0, 0), (0, -1), 'RIGHT'), 
     ('INNERGRID', (0, 0), (-1, -1), 1, colors.black), 
     ('FONT', (1, 0), (1, -1), 'Helvetica', 9), 
     ('ALIGN', (1, 0), (1, -1), 'LEFT') 
     ]) 
headerTableStyle = TableStyle(
     [('FONT', (0, 0), (-1, 0), 'Helvetica', 8), 
     ('FONT', (0, 1), (-1, 1), 'Helvetica-Bold', 8), 
     ('ALIGN', (0, 0), (-1, -1), 'CENTER'), 
     ('LINEBELOW', (0, 0), (-1, 0), 1, colors.black), 
     ('LINEAFTER', (0, 0), (-1, -1), 20, colors.white), 
     ('LEFTPADDING', (0,0), (-1, -1), 15), 
     ('RIGHTPADDING', (0, 0), (-1, -1), 15) 
     ]) 

########################## 
######## Classes ######### 
########################## 

class Course: 
    def __init__(self): 
     self.prefix = "" 
     self.number = "" 
     self.section = "" 
     self.instructor = "" 
     self.email = "" 
     self.name = "None Found" 
     self.enrollment = 0 
     self.semester = "" 
     self.report = [] # subreport for the course 
     self.dataFile = [] 

    def __repr__(self): 
     return self.prefix + " " + self.number + " " + self.section + " " + self.instructor 

class Instructor: 
    def __init__(self): 
     self.name = "" 
     self.email = "" 
     self.courses = dict([]) 
     self.report = [] 
     self.dataFile = [] 

    def __repr__(self): 
     return self.name + " " + self.email 

class Department: 
    def __init__(self): 
     self.name = "" 
     self.instructors = dict([]) #contains Instructor objects 
     self.report = [] #subreport for the department 
     self.dataFile = [] 

    def __repr__(self): 
     return self.name 

class College: 
    def __init__(self): 
     self.name = "" 
     self.departments = dict([]) #contains Department objects 
     self.report = [] #subreport for the college 
     self.dataFile = [] 

    def __repr__(self): 
     return self.name + ":" + `self.departments` 

class University: 
    def __init__(self): 
     self.name = "" 
     self.colleges = dict([]) #contains College objects 

    def __repr__(self): 
     return self.name + ":" + `self.colleges` 

######################### 
### Utility Functions ### 
######################### 

def onReportPage(canv, doc): 
    #display general info at the top of every page 
    canv.setFont('Courier', 10) 
    canv.drawString(inch, 10.5*inch, "Wassamata U") 
    canv.drawString(inch, 10.35*inch, "Student Comments") 

    canv.drawString(5.75*inch, 10.5*inch, "Year/Term: " + uSemesterYear + "/" + uSemesterTerm) 
    canv.drawString(5.75*inch, 10.35*inch, " Semester: " + `semesterNumber`) 

def xmlify(text): 
    return text.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;') 

def semesterDescription(semesterNumber): 
    # reference semester is Spring 1964, i.e. semester 0 
    semesterNumber = semesterNumber/10 
    year = `1964 + (semesterNumber/3)` 
    term = "Spring" 
    if semesterNumber % 3 == 1: 
     term = "Summer" 
    elif semesterNumber % 3 == 2: 
     term = "Fall" 

    return year, term 

######################### 
######### Main ########## 
######################### 

# set up some options 
# should have a ui later 

# ugly, but quick 
# used to get them on the top of every page 
global uSemesterYear 
global uSemesterTerm 

print "\n" 

university = University() 
university.name = "Wassamata U" 

commentsFile = open("spireport2.csv", "rb").read() 
commentRecords = commentsFile.split("ô\r\n") 
commentsArray = [] 
for commentRecord in commentRecords: 
    commentsArray.append(commentRecord.split("æ")) 
commentsArray.pop() 

print "Reading in the SPI file" 
#read in data from file 
for row in commentsArray: 
    #print row 
    # college 
    currentCollege = university.colleges.get(row[0]) 
    if currentCollege == None: 
     currentCollege = College() 
     currentCollege.name = row[0].replace("/", " ") 
     university.colleges[row[0]] = currentCollege 

    #department 
    currentDepartment = currentCollege.departments.get(row[1]) 
    if currentDepartment == None: 
     currentDepartment = Department() 
     currentDepartment.name = row[1].replace("/", " ") 
     currentCollege.departments[row[1]] = currentDepartment 

    #instructor 
    currentInstructor = currentDepartment.instructors.get(row[2] + row[3]) 
    if currentInstructor == None: 
     currentInstructor = Instructor() 
     currentInstructor.name = row[3].replace("/", " ") 
     currentInstructor.email = row[2].replace("/", " ") 
     currentDepartment.instructors[row[2] + row[3]] = currentInstructor 

    #course 
    currentCourse = currentInstructor.courses.get(row[5] + row[6] + row[7]) 
    if currentCourse == None: 
     currentCourse = Course() 
     currentCourse.prefix = row[5][:3] 
     currentCourse.number = row[5][3:] 
     currentCourse.section = row[6] 
     currentCourse.instructor = row[3] 
     currentCourse.email = row[2] 
     currentCourse.name = row[4] 
     currentCourse.semester = row[7] 
     currentCourse.enrollment = int(row[8]) 
     currentInstructor.courses[row[5] + row[6] + row[7]] = currentCourse 

    data = row[9:9+kNumberOfQuestions] 

    currentCollege.dataFile.append(data) #split the data file by college for later 
    currentInstructor.dataFile.append(data) 
    currentDepartment.dataFile.append(data) 
    currentCourse.dataFile.append(data) 

semesterNumber = int(university.colleges.values()[0].departments.values()[0].instructors.values()[0].courses.values()[0].semester) 
uSemesterYear, uSemesterTerm = semesterDescription(semesterNumber) 

reportDocContent = [] 

print "Processing the SPI comments" 

for eachCollege in university.colleges.values(): 
    print "\tProcessing " + eachCollege.name 
    collegeReportStartingIndex = len(reportDocContent) 

    reportDocContent.append(Spacer(0, 100)) 
    reportDocContent.append(Paragraph("Student comments for " + eachCollege.name, headerParagraphStyle)) 
    reportDocContent.append(PageBreak()) 

    for eachDepartment in eachCollege.departments.values(): 
     print "\t\tProcessing " + eachDepartment.name 
     departmentReportStartingIndex = len(reportDocContent) 

     reportDocContent.append(Spacer(0, 100)) 
     reportDocContent.append(Paragraph("Student comments for " + eachDepartment.name, headerParagraphStyle)) 
     reportDocContent.append(PageBreak()) 

     for eachInstructor in eachDepartment.instructors.values(): 
      print "\t\t\tProcessing " + eachInstructor.name 
      instructorReportStartingIndex = len(reportDocContent) 

      reportDocContent.append(Spacer(0, 100)) 
      reportDocContent.append(Paragraph("Student comments for " + eachInstructor.name + ", " + eachInstructor.email, headerParagraphStyle)) 
      reportDocContent.append(PageBreak()) 

      for eachCourse in eachInstructor.courses.values(): 
       courseReportStartingIndex = len(reportDocContent) 

       reportDocContent.append(Paragraph("<para leftIndent=54><b>Instructor Name:</b> " + eachCourse.instructor + "</para>", instructorParagraphStyle)) 
       reportDocContent.append(Spacer(0, 10)) 

       headerTableContent1 = [[eachDepartment.name + "/" + eachCollege.name, eachCourse.prefix + eachCourse.number + eachCourse.section, eachCourse.name], ["Department/School", "Course-Section Number", "Course Name"]] 
       headerTableContent2 = [[eachCourse.enrollment if eachCourse.enrollment > 0 else "Unknown", 
             len(eachCourse.dataFile), 
             ("%.2f" % (float(len(eachCourse.dataFile))/eachCourse.enrollment*100) if eachCourse.enrollment != 0 else "0.00")], 
             ["Number of Students Enrolled", "Number Responding", "% of Response"]] 
       reportDocContent.append(Table(headerTableContent1, style=headerTableStyle)) 
       reportDocContent.append(Spacer(0, 10)) 
       reportDocContent.append(Table(headerTableContent2, style=headerTableStyle)) 

       i = 0 
       for i in range(0, kNumberOfQuestions): 
        question = "" 
        if i == 0: 
         question = "The thing(s) I like the MOST about this course:" 
        elif i == 1: 
         question = "The thing(s) I like the LEAST about this course:" 
        elif i == 2: 
         question = "What is your reaction to the method of evaluating your mastery of the course (i.e., testing, grading, out of class assignments (term papers), instructor feedback, etc.):" 
        elif i == 3: 
         question = "Additional comments and suggestions for improvement:" 

        reportDocContent.append(Spacer(0, 10)) 
        reportDocContent.append(Paragraph(question, style=questionParagraphStyle)) 
        reportDocContent.append(Spacer(0, 5)) 

        commentParagraph = "" 
        for comments in eachCourse.dataFile: 
         if comments[i] != "": 
          commentParagraph += unicode(comments[i], 'latin-1') + "<br/>" 
        reportDocContent.append(Paragraph(commentParagraph, style=commentParagraphStyle)) 

       eachCourse.report = reportDocContent[courseReportStartingIndex:] 
       reportDocContent.append(PageBreak()) 

      eachInstructor.report = reportDocContent[instructorReportStartingIndex:] 

     eachDepartment.report = reportDocContent[departmentReportStartingIndex:] 

    eachCollege.report = reportDocContent[collegeReportStartingIndex:] 

# build directory structure to put reports in 
for eachCollege in university.colleges.values(): 
    if (not os.path.exists(eachCollege.name)): 
     os.mkdir(eachCollege.name) 
    for eachDepartment in eachCollege.departments.values(): 
     if (not os.path.exists(os.path.join(eachCollege.name, eachDepartment.name))): 
      os.mkdir(os.path.join(eachCollege.name, eachDepartment.name)) 
     for eachInstructor in eachDepartment.instructors.values(): 
      if (not os.path.exists(os.path.join(eachCollege.name, eachDepartment.name, eachInstructor.name + " - " + eachInstructor.email))): 
       os.mkdir(os.path.join(eachCollege.name, eachDepartment.name, eachInstructor.name + " - " + eachInstructor.email)) 

print "Building Comments Report PDFs" 
for eachCollege in university.colleges.values(): 
    print "\tBuilding Comments Report for " + eachCollege.name 

    collegeReportDoc = SimpleDocTemplate(os.path.join(eachCollege.name, eachCollege.name + " SPI Comments Report.pdf"), pagesize=portrait(LETTER), allowSplitting=1) 
    collegeReportDoc.leftMargin = .25*inch 
    collegeReportDoc.rightMargin = .25*inch 
    collegeReportDoc.bottomMargin = .25*inch 

    collegeReportDoc.build(eachCollege.report, onFirstPage=onReportPage, onLaterPages=onReportPage) 

    for eachDepartment in eachCollege.departments.values(): 
     print "\t\tBuilding Comments Report for " + eachDepartment.name 

     departmentReportDoc = SimpleDocTemplate(os.path.join(eachCollege.name, eachDepartment.name, eachDepartment.name + " SPI Comments Report.pdf"), pagesize=portrait(LETTER), allowSplitting=1) 
     departmentReportDoc.leftMargin = .25*inch 
     departmentReportDoc.rightMargin = .25*inch 
     departmentReportDoc.bottomMargin = .25*inch 

#  import pdb; pdb.set_trace() 
     departmentReportDoc.build(eachDepartment.report, onFirstPage=onReportPage, onLaterPages=onReportPage) 

     print "\t\t\tBuilding Comments Reports for individual instructors" 
     for eachInstructor in eachDepartment.instructors.values(): 
      instructorReportDoc = SimpleDocTemplate(os.path.join(eachCollege.name, eachDepartment.name, eachInstructor.name + " - " + eachInstructor.email, eachInstructor.name + " SPI Comments Report.pdf"), pagesize=portrait(LETTER), allowSplitting=1) 
      instructorReportDoc.leftMargin = .25*inch 
      instructorReportDoc.rightMargin = .25*inch 
      instructorReportDoc.bottomMargin = .25*inch 

      instructorReportDoc.build(eachInstructor.report, onFirstPage=onReportPage, onLaterPages=onReportPage) 
#we do this one last because it's the biggest; otherwise it'd be at the beginning of the pdf report generation process 
print "\tBuilding SPI Report for University" 
reportDoc = SimpleDocTemplate("SPI Comments Report.pdf", pagesize=portrait(LETTER), allowSplitting=1) 
reportDoc.leftMargin = .25*inch 
reportDoc.rightMargin = .25*inch 
reportDoc.bottomMargin = .25*inch 

reportDoc.build(reportDocContent, onFirstPage=onReportPage, onLaterPages=onReportPage) 

spireport2.csv:

 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]mple.comæAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æsample commentsææi like itæô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205æone with a line break; let's see what happensæææweird charactèrs áÈ-{ô 
College of Health & Public AffæCriminal Justice/Legal Studiesæ[email protected]æAn InstructoræFOUNDATIONS OF LAW ENFORCEMENTæCJE5021æ0001æ1370æ 7ææææô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205ææææô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205ææææô 
College of Health & Public AffæHealth Info Mgmtæ[email protected]æAn InstructoræMEDICAL TERMINOLOGYæHSC3537æ0M01æ1370æ 205ææææô 
College of Arts & HumanitiesæEnglishæ[email protected]æAn InstructoræHARLEM, HAITI, AND HAVANAæAML3615æ0001æ1370æ 35ææææô 
College of Arts & HumanitiesæEnglishæ[email protected]æAn InstructoræCONT AMERICAN WOMEN S FICTIONæAML3283æ0001æ1370æ 35ææææô 
College of Arts & HumanitiesæEnglishæ[email protected]æAn InstructoræPOST-WORLD WAR II FICTIONæLIT4303æ0M01æ1370æ 32ææææô 
College of Arts & HumanitiesæEnglishæ[email protected]æAn InstructoræMAJOR AMERICAN AUTHORSæAML4300æ0001æ1370æ 33ææææô 
College of Arts & HumanitiesæEnglishæ[email protected]æAn InstructoræPRACTICAL CRITICISMæENG3010æ0001æ1370æ 36ææææô 
+0

Xin vui lòng gửi một ví dụ về toàn bộ tập tin để những người khác có thể lặp lại lỗi. –

+0

Làm việc trên đó. Cố gắng để cắt giảm nó xuống một cái gì đó mà mọi người thực sự có thể chạy (mã thực sự liên quan đến rất nhiều thứ khác để có được dữ liệu của nó). Cho đến nay, tuy nhiên, không có sự cắt giảm nào của tôi gây ra lỗi, mặc dù tất cả những gì tôi đã làm thực sự là trao đổi các nguồn dữ liệu với dữ liệu tĩnh trong mã. Hmmmmm ... –

+0

Ok, tất cả mã được đăng. Hy vọng rằng sẽ giúp. Đã làm một số chi tiết trong chiều sâu gỡ lỗi, nhưng tất cả nó đã làm cho tôi thấy làm thế nào vấn đề đang xảy ra, không phải những gì tôi có thể làm gì về nó. –

Trả lời

2

Tìm thấy một workaround bản thân mình. Dựa trên một số code changes made in rst2pdf, tôi đã có thể nhận được mã của mình hoạt động đáng tin cậy. Các giải pháp, mặc dù xấu xí, là để bọc tất cả các Paragraphs của tôi trong phần mã tạo ra Paragraphs cho các ý kiến ​​của học sinh bên trong KeepTogether. Ví dụ: tôi đã thay đổi một dòng có liên quan thành:

reportDocContent.append(KeepTogether(Paragraph(commentParagraph, style=commentParagraphStyle))) 

và bây giờ nó hoạt động (ít nhất, tôi chưa thể phá vỡ nó sau khi thử nhiều dữ liệu mẫu).

+0

Điều gì đã xảy ra trước đó? Trước khi bạn thêm KeepTogether. Tôi đang mắc kẹt với cùng một vấn đề nhưng tôi không biết làm thế nào để bóp trong điều này KeepTogether huyền diệu. –

+0

Chỉ cần bọc bất cứ điều gì nó là bạn có bên trong KeepTogether. Ví dụ, trước khi mã của tôi là 'reportDocContent.append (Đoạn (commentParagraph, style = commentParagraphStyle))'. Điều này thực sự là một loại lạm dụng của KeepTogether, vì tôi chỉ đưa vào một thứ, nhưng nó hoạt động. –

1

Có vẻ như đây là câu hỏi cũ nhưng tôi đã gặp phải lỗi tương tự này rất gần đây và đến đây để tìm một số lời khuyên. Việc sửa chữa tôi thực hiện là làm cho kích thước miếng đệm bằng một nửa kích thước cũ. Nó trước đây là Spacer (1,0,2 * inch) và tôi đã đổi nó thành Spacer (1,0,1 * inch). Sau đó, không có lỗi nào khác.

FYI được thông báo lỗi tôi nhận được

File "/opt/python2.7/lib/python2.7/site-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/doctemplate.py", line 1117, in build 
    BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker) 
    File "/opt/python2.7/lib/python2.7/site-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/doctemplate.py", line 880, in build 
    self.handle_flowable(flowables) 
    File "/opt/python2.7/lib/python2.7/site-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/doctemplate.py", line 793, in handle_flowable 
    raise LayoutError(ident) 
reportlab.platypus.doctemplate.LayoutError: Flowable <Spacer at 0xf01440 frame=normal>...(1 x 14.4) too large on page 10 in frame 'normal'(439.275590551 x 628.28976378) of template 'Later' 
+0

Tôi lại gặp vấn đề tương tự và thay đổi kích thước miếng đệm thành kích thước nhỏ hơn. Nó đã làm việc. Tôi đã được một mình giúp đỡ lần này. – yoshi

Các vấn đề liên quan