2012-11-13 20 views
7

Tôi có reportlab SimpleDocTemplate và trả về dưới dạng PDF động. Tôi tạo ra nội dung của nó dựa trên một số siêu dữ liệu mô hình Django. Đây là thiết lập mẫu của tôi:Hợp nhất PDF hiện tại vào tệp ReportLab PDF mới qua lưu lượng

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

tôi có thể dễ dàng thêm siêu dữ liệu văn bản từ mô hình Entry vào danh sách Story được xây dựng sau:

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

Và sau đó tạo PDF để được trả lại trong phản ứng bằng gọi build trên SimpleDocTemplate:

lĩnh vực
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 

một siêu dữ liệu trên mô hình là một tập tin attachm ent. Khi những tệp đính kèm đó là các tệp PDF, tôi muốn hợp nhất chúng thành Câu chuyện mà tôi đang tạo; IE có nghĩa là một tệp PDF loại reportlab "flowable".

Tôi đang cố gắng làm như vậy bằng cách sử dụng pdfrw, nhưng chưa có bất kỳ may mắn nào. Lý tưởng nhất tôi muốn gọi là:

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

và nối pdf vào danh sách Câu chuyện hiện có để đưa vào tạo tài liệu cuối cùng, như đã lưu ý ở trên.

Bất kỳ ai có ý tưởng nào? Tôi cố gắng một cái gì đó tương tự như sử dụng pagexobj để tạo pdf, cố gắng làm theo ví dụ này:

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

Nhưng không có bất kỳ may mắn trong hai. Ai đó có thể giải thích cho tôi cách tốt nhất để hợp nhất một tệp PDF hiện có vào một reportlab có thể lưu chuyển? Tôi không tốt với công cụ này và đã đập đầu vào thế hệ pdf trong nhiều ngày nay. :) Bất kỳ hướng nào được đánh giá cao!

+0

Tôi nghĩ bạn có thể thực hiện việc này với phiên bản ReportLab trả phí. –

+0

Ugh, tôi không nghĩ rằng phiên bản trả tiền của ReportLab là một lựa chọn cho tôi, thật không may. :(Bất cứ ai có bất kỳ lựa chọn thay thế? – kyleturner

Trả lời

1

Tôi vừa có một tác vụ tương tự trong một dự án. Tôi đã sử dụng reportlab (phiên bản nguồn mở) để tạo các tệp pdf và pyPDF để tạo điều kiện hợp nhất. Yêu cầu của tôi hơi khác một chút ở chỗ tôi chỉ cần một trang từ mỗi tệp đính kèm, nhưng tôi chắc rằng điều này có thể đủ gần để bạn có được ý tưởng chung.

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

Tôi đã sử dụng lớp sau để giải quyết vấn đề của mình. Nó chèn các tệp PDF dưới dạng hình ảnh PDF vector. Nó hoạt động rất tốt vì tôi cần có một bảng nội dung. Đối tượng có thể chảy được cho phép chức năng TOC tích hợp hoạt động như một nét duyên dáng.

Is there a matplotlib flowable for ReportLab?

Lưu ý: Nếu bạn có nhiều trang trong tập tin, bạn cần phải sửa đổi các lớp hơi. Lớp mẫu được thiết kế để chỉ đọc trang đầu tiên của tệp PDF.

Các vấn đề liên quan