2012-11-13 11 views
7

Ho un reportlab SimpleDocTemplate e lo restituisco come PDF dinamico. Sto generando il suo contenuto basato su alcuni metadati del modello Django. Qui è la mia messa a punto del modello:Unisci PDF esistente nel nuovo ReportLab PDF via flowable

buff = StringIO() 
doc = SimpleDocTemplate(buff, pagesize=letter, 
         rightMargin=72,leftMargin=72, 
         topMargin=72,bottomMargin=18) 
Story = [] 

posso facilmente aggiungere metadati testuali dal modello Entry nella lista Story da costruire in seguito:

ptext = '<font size=20>%s</font>' % entry.title.title() 
    paragraph = Paragraph(ptext, custom_styles["Custom"]) 
    Story.append(paragraph) 

e quindi generare il file PDF da restituire nella risposta da chiamando build sul SimpleDocTemplate:

campo
doc.build(Story, onFirstPage=entry_page_template, onLaterPages=entry_page_template) 

pdf = buff.getvalue() 
resp = HttpResponse(mimetype='application/x-download')  
resp['Content-Disposition'] = 'attachment;filename=logbook.pdf' 
resp.write(pdf) 
return resp 

uno dei metadati del modello è un file di montag ent. Quando questi file allegati sono PDF, vorrei unirli alla storia che sto generando; IE significa un PDF di tipo "flowable" di reportlab.

Sto tentando di farlo utilizzando pdfrw, ma non ho avuto fortuna. Idealmente mi piacerebbe chiamare solo:

from pdfrw import PdfReader 
pdf = pPdfReader(entry.document.file.path) 
Story.append(pdf) 

e aggiungere il pdf alla lista Story esistente da includere nella generazione del documento finale, come osservato in precedenza.

Qualcuno ha qualche idea? Ho provato qualcosa di simile utilizzando pagexobj per creare pdf, cercando di seguire questo esempio:

http://code.google.com/p/pdfrw/source/browse/trunk/examples/rl1/subset.py

from pdfrw.buildxobj import pagexobj 
from pdfrw.toreportlab import makerl 

pdf = pagexobj(PdfReader(entry.document.file.path)) 

ma non ha avuto fortuna neanche. Qualcuno può spiegarmi il modo migliore per unire un file PDF esistente in un reportlab scorrevole? Non sono bravo con questa roba e ho battuto la testa sulla generazione di PDF da giorni ormai. :) Qualsiasi direzione molto apprezzata!

+0

Penso che si possa fare questo con la versione a pagamento di ReportLab. –

+0

Ugh, non penso che la versione a pagamento di ReportLab sia un'opzione per me, sfortunatamente. :(Qualcuno ha qualche alternativa? – kyleturner

risposta

1

Ho appena avuto un compito simile in un progetto. Ho utilizzato reportlab (versione open source) per generare file PDF e pyPDF per facilitare l'unione. Le mie esigenze erano leggermente diverse in quanto avevo solo bisogno di una pagina per ogni allegato, ma sono sicuro che probabilmente è abbastanza vicino da farti avere un'idea generale.

from pyPdf import PdfFileReader, PdfFileWriter 

def create_merged_pdf(user): 
    basepath = settings.MEDIA_ROOT + "/" 
    # following block calls the function that uses reportlab to generate a pdf 
    coversheet_path = basepath + "%s_%s_cover_%s.pdf" %(user.first_name, user.last_name, datetime.now().strftime("%f")) 
    create_cover_sheet(coversheet_path, user, user.performancereview_set.all()) 

    # now user the cover sheet and all of the performance reviews to create a merged pdf 
    merged_path = basepath + "%s_%s_merged_%s.pdf" %(user.first_name, user.last_name, datetime.now().strftime("%f")) 

    # for merged file result 
    output = PdfFileWriter() 

    # for each pdf file to add, open in a PdfFileReader object and add page to output 
    cover_pdf = PdfFileReader(file(coversheet_path, "rb")) 
    output.addPage(cover_pdf.getPage(0)) 

    # iterate through attached files and merge. I only needed the first page, YMMV 
    for review in user.performancereview_set.all(): 
     review_pdf = PdfFileReader(file(review.pdf_file.file.name, "rb")) 
     output.addPage(review_pdf.getPage(0)) # only first page of attachment 

    # write out the merged file 
    outputStream = file(merged_path, "wb") 
    output.write(outputStream) 
    outputStream.close() 
1

Ho usato la seguente classe per risolvere il mio problema. Inserisce i PDF come immagini PDF vettoriali. Funziona benissimo perché avevo bisogno di avere un sommario. L'oggetto flowable ha permesso alla funzionalità TOC incorporata di funzionare come un incantesimo.

Is there a matplotlib flowable for ReportLab?

Nota: se si dispone di più pagine del file, è necessario modificare leggermente la classe. La classe di esempio è progettata per leggere solo la prima pagina del PDF.

Problemi correlati