2011-09-29 32 views
8

Tôi đang sử dụng Pisa để chuyển đổi HTML sang PDF (trong một dự án Django). Rất chậm khi xử lý các bảng trải rộng trên nhiều trang:Pisa pdf converter rất chậm với các bảng lớn

bảng 200 hàng sẽ mất đến 150 giây để chuyển đổi, trong khi mất 15 giây nếu tôi chia thành các bảng nhỏ hơn.

Có mẹo hay phương pháp hay nhất để xây dựng các bảng HTML để xử lý bởi Pisa không?

+0

nó có thể không giúp đỡ nhưng bạn đã xem wkhtmltopdf chưa? – Matt

+0

Có lẽ tôi sẽ xem xét nếu không có giải pháp nào khác: Tôi đã chọn Pisa vì tích hợp với Django ... – Don

+2

FWIW Tôi thực hiện một số tài liệu dựa trên bảng nhưng chỉ về một trang nội dung tải gần như ngay lập tức nhưng các báo cáo tôi thực hiện có gần 1300 hàng và khoảng 50 trang mất gần 30 giây. Bạn đang sử dụng cái nĩa nào? Tôi có thể thử [ChrisGlass/Xhtml2pdf] (https://github.com/chrisglass/xhtml2pdf/tree/xhtml2pdf-refactor) để xem nó có được cải thiện qua [phiên bản gốc] không duy trì (https://github.com/ hay không) holtwick/xhtml2pdf) –

Trả lời

7

Tôi cũng gặp vấn đề tương tự. Tài liệu chỉ là một trang đầu và một cái bàn lớn. Thời gian hiển thị PDF tăng lên theo cấp số nhân với kích thước của bảng nội dung của tôi.

tôi đã thực hiện một danh sách kiểm tra điều cần kiểm tra mà có thể là vấn đề

tôi đã làm thời gian đơn giản về chức năng PDF vẽ của tôi (vì nó có thể là vẽ HTML, đi qua nó để StringIO, hoặc tạo ra các phản ứng HTTP) và nhận thấy rằng cuộc gọi pisa.pisaDocument mất 60 giây để quay lại. Tôi đã làm một danh sách kiểm tra của những thứ có thể là vấn đề, và làm việc trên chúng mỗi. Danh sách kiểm tra bao gồm Hình ảnh, CSS, Độ phức tạp đánh dấu và Khung.

Hình ảnh hầu như không ảnh hưởng đến thời gian hiển thị (tôi chỉ có một trang trên mỗi trang, vì vậy YMMV). Khung hình cũng không.

Độ phức tạp đánh dấu là vấn đề chính của mẫu của tôi. Rõ ràng pisa sẽ hiển thị nhiều cột trong một bảng rất, rất chậm

Bảng đã mất quá nhiều thời gian để hiển thị, nhưng tôi nhận thấy rằng nếu tôi chia bảng thành các bảng nhỏ hơn, thời gian hiển thị không tăng theo cấp số nhân nữa, và thời gian cần để làm mọi thứ bị cắt làm đôi. Tôi đã sử dụng mã dưới đây vào mẫu Django của tôi:

{% if forloop.counter|divisibleby:20 %}</table><table>{% endif %} 

chỉnh sửa: sửa chữa này không hoạt động tốt với lặp lại tiêu đề bảng vì vậy nếu bạn đang làm repeat="1" bạn phải biết chính xác có bao nhiêu hàng để phù hợp với từng trang.

Ngoài ra, tôi đã có con quái vật này của một selector trong CSS của tôi:

html, body, div, span, applet, object, iframe, 
    h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
    a, abbr, acronym, address, big, cite, code, 
    del, dfn, em, img, ins, kbd, q, s, samp, 
    small, strike, strong, sub, sup, tt, var, 
    b, u, i, center, 
    dl, dt, dd, ol, ul, li, 
    fieldset, form, label, legend, 
    table, caption, tbody, tfoot, thead, tr, th, td, 
    article, aside, canvas, details, embed, 
    figure, figcaption, footer, header, hgroup, 
    menu, nav, output, ruby, section, summary, 
    time, mark, audio, video{ 
     ... 
    } 

Bằng cách thay đổi nó để * {...} rendering tăng tốc lên một chút. Điều này phản trực giác vì trình duyệt sẽ không hiển thị nhanh trang của bạn khi bạn sử dụng công cụ chọn * so với khi bạn sử dụng con quái vật ở trên.

Ngoài ra, vì một số lý do, việc hợp nhất hai thẻ trong trang <style> vào một thẻ cũng giảm thời gian hiển thị.

+0

Tôi cũng đã kết thúc chia tách bảng của mình, nhưng có những trường hợp mà tôi không thể biết trước số lượng hàng phù hợp với một trang – Don

+1

Đối với trường hợp của tôi, nó không quan trọng Tôi chỉ phải cầu nguyện rằng không ai bảo tôi lặp lại các tiêu đề bảng, bởi vì sửa lỗi này không hoạt động với lặp lại = "1" –

+0

Phá vỡ bảng đã cho tôi tốc độ ~ 3x Tôi nghĩ rằng sự chậm chạp có thể là do một vấn đề trong Reportlab - https://groups.google.com/forum/#!topic/xhtml2pdf/vUoq1IRauvg –

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