2012-03-23 26 views
5

Trong ReportLab, Vẽ đối tượng có thể được ghi vào kết xuất đồ họa khác nhau, ví dụ:Django ReportLab: sử dụng đối tượng Vẽ để tạo PDF và gửi lại qua HttpResponse

d = shapes.Drawing(400, 400) 
renderPDF.drawToFile(d, 'test.pdf') 

và trong Django, đối tượng Canvas có thể được gửi qua HttpResponse, ví dụ như:

response = HttpResponse(mimetype='application/pdf') 
response['Content-Disposition'] = 'filename=test.pdf' 
c = canvas.Canvas(response) 

trong trường hợp của tôi, sự cố của tôi là tôi có tập lệnh reportLab sử dụng đối tượng Vẽ để lưu vào hệ thống tệp cục bộ. Tôi bây giờ đặt nó trong quan điểm Django, và tự hỏi liệu có một cách để không lưu vào hệ thống tập tin địa phương nhưng thay vì gửi lại cho khách hàng.

Tôi hy vọng tôi mô tả rõ ràng câu hỏi này.

Cảm ơn lời khuyên nào!

cập nhật

nó quay ra có một chức năng trong renderPDF:

renderPDF.draw(drawing, canvas, x, y) 

mà có thể làm cho bản vẽ() đối tượng trong khung hình nhất định.

Trả lời

2

nó quay ra có một chức năng trong renderPDF:

renderPDF.draw (bản vẽ, vải, x, y) mà có thể làm cho bản vẽ() đối tượng trong khung hình nhất định.

6

Sử dụng ReportLab ở Django mà không lưu vào đĩa thực sự khá dễ dàng. Thậm chí còn có các ví dụ trong DjangoDocs (https://docs.djangoproject.com/en/dev/howto/outputting-pdf)

Bí quyết cơ bản là sử dụng "tệp như đối tượng" thay vì tệp thực tế. Hầu hết mọi người sử dụng StringIO cho việc này.

Bạn có thể làm điều đó khá đơn giản với

from cStringIO import StringIO 

def some_view(request): 
    filename = 'test.pdf' 

    # Make your response and prep to attach 
    response = HttpResponse(mimetype='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename=%s.pdf' % (filename) 
    tmp = StringIO() 

    # Create a canvas to write on 
    p = canvas.Canvas(tmp) 
    # With someone on 
    p.drawString(100, 100, "Hello world") 

    # Close the PDF object cleanly. 
    p.showPage() 
    p.save() 

    # Get the data out and close the buffer cleanly 
    pdf = tmp.getvalue() 
    tmp.close() 

    # Get StringIO's body and write it out to the response. 
    response.write(pdf) 
    return response 
+0

cảm ơn! nhưng tôi nghĩ bạn hiểu lầm câu hỏi của tôi, hoặc tôi không nói rất rõ ràng. Tôi biết làm thế nào để làm điều này bằng cách sử dụng đối tượng Canvas, tôi đang tìm kiếm một cách để đặt Vẽ() đối tượng trong httpresponse. – Simon

+0

vì vậy tôi có thể hiểu mẫu bạn đã cung cấp dưới dạng: d = Bản vẽ (400, 400) và sau đó: pdf = buffer.getvalue() buffer.close() và cuối cùng là: response.write (pdf)? – Simon

+0

nó không hoạt động với Drawing(). vải là tốt. trong ví dụ của bạn, có lỗi đánh máy: đệm <-> tmp – Simon

0

Vẽ có một phương pháp gọi là asString với một thuộc tính cần thiết mà đại diện cho định dạng bản vẽ cần thiết như 'png', 'gif' hoặc 'jpg'. nên thay vì gọi

renderPDF.drawToFile(d, 'test.pdf') 

Bạn có thể gọi

binaryStuff = d.asString('gif') 
return HttpResponse(binaryStuff, 'image/gif') 

Mà không cần phải lưu bản vẽ của bạn vào đĩa.

Kiểm tra https://code.djangoproject.com/wiki/Charts để biết ví dụ đầy đủ.

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