2012-11-13 16 views
7

Mam szablon SimpleDocTemplate i zwracam go jako dynamiczny plik PDF. Generuję treść na podstawie niektórych metadanych modelu Django. Oto moja konfiguracja szablonu:Scalanie istniejącego pliku PDF w nowy plik ReportLab PDF za pośrednictwem plików

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

mogę łatwo dodawać metadane tekstową z modelu Entry do listy Story powstać później:

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

a następnie wygenerować plik PDF być zwracane w odpowiedzi przez nazywając build na SimpleDocTemplate:

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 

Jedno pole metadanych w modelu jest dob./mon plik ent. Kiedy te załączniki plików są plikami PDF, chciałbym je połączyć w Opowieść, którą generuję; IE oznacza plik reportlab "płynny".

Próbuję to zrobić, używając pdfrw, ale nie miałem szczęścia. Idealnie chciałbym po prostu zadzwoń:

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

i dołączyć pdf do istniejącej listy Story, które należy uwzględnić w tworzeniu ostatecznej wersji dokumentu, jak wspomniano powyżej.

Ktoś ma jakieś pomysły? Próbowałem coś podobnego używając pagexobj stworzyć pdf, starając się podążać za tym przykładem:

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

ale nie miał szczęścia albo. Czy ktoś może mi wytłumaczyć najlepszy sposób na scalenie istniejącego pliku PDF w raporcie? Nie jestem z tym dobry i od wielu dni walę głową o generowanie plików pdf. :) Każdy kierunek bardzo mile widziany!

+0

Myślę, że możesz to zrobić za pomocą płatnej wersji ReportLab. –

+0

Ugh, nie sądzę, że płatna wersja ReportLab jest dla mnie opcją, niestety. :(Ktoś ma jakieś alternatywy? – kyleturner

Odpowiedz

1

Po prostu miałem podobne zadanie w projekcie. Użyłem reportlab (wersja open source) do generowania plików pdf i pyPDF, aby ułatwić scalanie. Moje wymagania były nieco inne, ponieważ potrzebowałem tylko jednej strony z każdego załącznika, ale jestem pewien, że jest to prawdopodobnie wystarczająco blisko, aby uzyskać ogólny pomysł.

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

Użyłem następującej klasy, aby rozwiązać mój problem. Wstawia pliki PDF jako obrazy wektorowe w formacie PDF. Działa świetnie, ponieważ potrzebowałem mieć spis treści. Płynny obiekt pozwalał wbudowanej funkcji TOC działać jak urok.

Is there a matplotlib flowable for ReportLab?

Uwaga: Jeśli masz wiele stron w pliku, trzeba zmodyfikować klasę nieznacznie. Przykładowa klasa jest zaprojektowana tak, aby po prostu przeczytać pierwszą stronę pliku PDF.

Powiązane problemy