Динамическая информация Reportlab в шаблоне страницы
Я должен конвертировать длинный форматированный текстовый документ в PDF, используя ReportLab
, Моя цель - читать текстовый файл постранично (1 страница в текстовом файле имеет переменную длину и определяется подачей формы). Затем для каждой страницы я должен написать статическую часть страницы, используя onPage
Функция шаблона страницы наряду с вставкой динамической части в одну или несколько страниц PDF-файла.
Вопрос мой 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())
1 ответ
После некоторого исследования я пришел к выводу, что не было способа справиться с этим динамически. Единственным оставшимся обходным решением было получить доступ ко всему файлу в списке. А потом onPage
Функция шаблона страницы использует глобальную переменную для отслеживания # страницы и доступа к соответствующим строкам списка на основе # страницы.