2012-11-13 16 views
7

SimpleDocTemplate numaralı bir rapora sahibim ve bunu dinamik bir PDF olarak döndürüyorum. Bazı Django model meta verilerine dayanarak içerik oluşturuyorum. Kolayca Story listesine Entry modelinden metinsel meta ekleyebilir Mevcut PDF'yi akışkanlar aracılığıyla yeni ReportLab PDF'ye birleştirme

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

inşa edilecek sonradan: İşte benim şablon düzmece

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

Sonra PDF tarafından yanıt olarak iade edilecek üretmek SimpleDocTemplate üzerine build arayarak:

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 

bir meta veri modeline bir dosya attachm olduğunu ent. Bu dosya ekleri PDF'ler olduğunda, bunları oluşturduğum öyküye dahil etmek isterim; IE, rapor edilebilir "akıcı" tipte bir PDF anlamına gelir.

pdfrw'u kullanmayı denedim, ancak hiç şansınız olmadı.

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

ve yukarıda belirtildiği gibi mevcut Story listeye pdf nihai belgenin nesil dahil edilecek ekleyin: İdeal Sadece arayıp isteriz.

Herhangi bir fikri olan var mı? Ben bu örneği takip etmeye çalışıyorum, pdf oluşturmak için pagexobj kullanarak benzer bir şey denedim:

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

Ama her iki herhangi şans yoktu. Birisi mevcut bir PDF dosyasını akıcı bir rapor dosyasına birleştirmenin en iyi yolunu açıklayabilir mi? Bu şeylerle pek iyi değilim ve günler için kafamı pdf-jenerasyonunda becermeye başladım. :) Herhangi bir yön büyük takdir!

+0

Bunu, ReportLab'ın ücretli sürümü ile yapabileceğinizi düşünüyorum. –

+0

Ugh, maalesef ReportLab'ın ücretli sürümü benim için bir seçenek değil. :(Herhangi bir alternatif var mı? – kyleturner

cevap

1

Bir projede benzer bir görev yaptım. Birleştirme işlemini kolaylaştırmak için pdf dosyalarını ve pyPDF'u oluşturmak için reportlab (açık kaynak sürümü) kullandım. Gereksinimlerim biraz farklıydı çünkü her ekten sadece bir sayfaya ihtiyacım vardı, ama eminim ki bu genel fikri elde etmek için yeterince yakın.

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

Sorunumu çözmek için aşağıdaki sınıfı kullandım. PDF'leri vektör PDF görüntüleri olarak ekler. Harika çalışıyor, çünkü bir tabloya ihtiyacım vardı. Akıcı nesne, yerleşik TOC işlevselliğinin bir çekicilik gibi çalışmasına izin verdi.

Is there a matplotlib flowable for ReportLab?

Not: dosyada birden fazla sayfa varsa, biraz sınıfını değiştirmek zorunda. Örnek sınıf, sadece PDF'nin ilk sayfasını okumak için tasarlanmıştır.

İlgili konular