2016-03-27 5 views
0

Мне нужно преобразовать длинный форматированный текстовый документ в PDF с помощью ReportLab. Моя цель - прочитать текстовый файл по странице (1 страница в текстовом файле имеет переменную длину и определяется по форме). Затем для каждой страницы мне приходится писать статическую часть страницы с использованием функции шаблона страницы с добавлением динамической части на одну или несколько страниц PDF-файла.Динамическая информация Reportlab в pagetemplate

Проблема: моя функция onPage не вызывается до тех пор, пока я не позвоню build для документа. Какое альтернативное решение для динамического создания pdf-страниц при чтении текстовых страниц.

Вот часть скрипта, пытающегося записать статическое содержимое страницы.

#Globals 
formlines = [] 
header = [] 
footer = [] 
detail_lines = [] 
def processForm(): 
    # First 15 lines header 
    # Then variable number of detail lines 
    # Last 15 line footer 
    header = formlines[0:14] 
    print "Processing form\n" 
    footer = formlines[-15:-1] 
    detail_lines = formlines[15:-15] 

def firstPgCanv(c, doc): 
    # Process header 
    pract_addr = header[0][0:43] + "\n" + header[1] + "\n" + header[2][0:43] 
    remit_to = header[8][44:] + "\n" + header[9][44:] + "\n" + header[10][44:] 
    guar_addr = header[8][1:42] + "\n" + header[9][1:42] + "\n" + header[10][1:42] 

    c.saveState() 
    c.translate(.3 * inch, 0 * inch) 

    tx = c.beginText(.3 * inch,height- .35 * inch) 
    tx.textLines(header_addr) 
    c.drawText(tx) 

    curY = curY - gap 
# Create text object 
    tx = c.beginText(.3 * inch, curY * inch) 
    tx.textLines(guar_addr) 
    c.drawText(tx) 

    tx = c.beginText(4.3 * inch, curY * inch) 
    tx.textLines(remit_to) 
    c.drawText(tx) 

    c.restoreState() 

def main(argv=None): 
    if argv is None: 
    argv = sys.argv 

    args = sys.argv[1:] 

    #Open source file 
    src_file = sys.argv[1] 
    dest = sys.argv[2] 
    dest_file = os.path.join(os.path.dirname(src_file), dest); 

    f=open(src_file, 'r') 
    #Document Template 
    doc = BaseDocTemplate(dest_file, 
         pagesize=letter, 
         leftMargin=.3*inch, 
         rightMargin= .1 * inch, 
         topMargin= .1 * inch, 
         bottomMargin=.3 * inch, 
         showBoundary=1) 

    # Frames 
    frameT = Frame(doc.leftMargin + 2*inch, doc.bottomMargin, doc.width - 2.01*inch, doc.height - 4.1*inch, id='normal', showBoundary=0) 
    frameB = Frame(doc.leftMargin+2, doc.bottomMargin, 7.5*inch, 10*inch, id='small', showBoundary=1) 

    # Page Templates 
    doc.addPageTemplates([PageTemplate(id='First',frames=frameT,onPage=firstPgCanv), 
         PageTemplate(id='Later',frames=frameB,onPage=othPgCanv) 
         ]) 

    Elements = [] 
    # Process the input file 
    while 1: 
    ln = f.readline() 
    if len(ln) == 0: # EOF 
     break 

    s = chomp(ln) 

    ff = s.find("\f")  
    if ff != -1:  # \f found along with first line of next form 
     frag = s.split("\f") 
     final = frag.pop() 
     formlines.append(final) 
     processForm() 
     Elements.append(NextPageTemplate('First')) 
     Elements.append(PageBreak) 
     # Here I will write few more pages of page Template 'Later' 
    else: 
     formlines.append(s) 

# EOF -- close and flush last page 
    f.close() 
    doc.build(Elements) 

if __name__ == "__main__": 
    sys.exit(main()) 

ответ

0

После некоторого исследования я пришел к выводу, что не было возможности обрабатывать его динамически. Единственным обходным решением было получить доступ ко всему файлу в список. А затем onPage Функция шаблона страницы использует глобальную переменную для отслеживания страницы # и доступа к соответствующим строкам списка на странице #.

Смежные вопросы