2009-01-16 39 views

Trả lời

3

[câu trả lời của tôi là không còn đúng, gradient đang có sẵn trong ReportLab, xem câu trả lời khác trên trang này để biết chi tiết.]

Xin lỗi vì đã hồi sinh câu hỏi này, nhưng tôi stumbled trên nó và nó hadn Không được trả lời đúng.

Câu trả lời là không, tính đến hôm nay, phiên bản hiện tại của ReportLab không hỗ trợ gradient. Gradients được hỗ trợ bởi PDF, tuy nhiên. Nếu bạn nhìn vào lớp Canvas của ReportLab bạn sẽ thấy rằng nhiều phương thức của nó là các trình bao bọc tương đối nhỏ xung quanh việc tạo mã PDF cơ bản. Để truy cập các gradient trong RL, bạn cần mở rộng lớp Canvas và thêm các phương thức bổ sung để tạo mã PDF chính xác. Điều này có thể thực hiện được, nhưng rõ ràng là không tầm thường, và điều đó có nghĩa là bạn phải đọc kỹ thông số PDF.

Có hai lựa chọn thay thế. Đầu tiên tạo gradient như là một hình ảnh raster và sử dụng nó, thứ hai tạo ra gradient bằng cách vẽ toàn bộ một loạt các hình chữ nhật với các màu khác nhau.

start_color = (1,0,0) 
end_color = (0,1,0) 
for i in range(100): 
    p = i * 0.01 
    canvas.setFillColorRGB(*[start_color[i]*(1.0-p)+end_color[i]*p for i in range(3)]) 
    canvas.rect(i, 0, 2, 100) 

Ví dụ: Thật không may là gradient mượt mà có rất nhiều hình chữ nhật, và điều này có thể làm cho tệp PDF lớn và hiển thị chậm. Bạn tốt hơn với cách tiếp cận raster.

Cuối cùng, bạn có thể cân nhắc sử dụng PyCairo. Điều này có hỗ trợ tốt hơn cho nhiều yếu tố đồ họa và có thể hiển thị thành PDF hoặc PNG. Tuy nhiên, nó thiếu các cấu trúc đòn bẩy cao hơn (chẳng hạn như bố cục trang).

6

Báo cáoLab giờ đây hỗ trợ độ dốc PDF.

Bản vá cho hỗ trợ dốc là posted to the ReportLab mailing list bởi Peter Johnson vào ngày 6 tháng 8 năm 2012 và là added to the source vào ngày hôm sau. Tôi không thể phát hiện bất cứ điều gì trong the release notes for ReportLab 2.6 nhưng kể từ khi được phát hành vào ngày 1 tháng 10 năm 2012 có lẽ là nó ở trong đó. Nó chắc chắn có mặt trong 2.7.

Có thể chỉ định cả hai gradient tuyến tính và hướng tâm với nhiều điểm dừng. Tìm kiếm tài liệu cho cụm từ gradient không bật lên bất kỳ thứ gì. Tuy nhiên, message with the first version of the patch có một vài ví dụ là cơ sở của some tests in the ReportLab source. Dựa trên điều này tôi đã làm việc lên một kịch bản demo nhanh:

from reportlab.pdfgen.canvas import Canvas 
from reportlab.lib.colors import red, yellow, green 
from reportlab.lib.units import mm 

c = Canvas("gradient.pdf") 

# Linear gradient with the endpoints extending over the page. 
c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow)) 
c.drawString(5*mm, 290*mm, "c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow))") 
c.line(105*mm, 200*mm, 180*mm, 100*mm) 
c.showPage() 

# Linear gradient constrained within the endpoints. 
c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow), extend=False) 
c.drawString(5*mm, 290*mm, "c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow), extend=False)") 
c.line(105*mm, 200*mm, 180*mm, 100*mm) 
c.showPage() 

# Linear gradient with multiple stops. 
c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow, green), (0, 0.8, 1), extend=False) 
c.drawString(5*mm, 290*mm, "c.linearGradient(105*mm, 200*mm, 180*mm, 100*mm, (red, yellow, green), (0, 0.8, 1), extend=False)") 
c.line(105*mm, 200*mm, 180*mm, 100*mm) 
c.line(141*mm, 102*mm, 189*mm, 138*mm) 
c.showPage() 

# Radial gradient with the endpoint extending over the page. 
c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow)) 
c.drawString(5*mm, 290*mm, "c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow))") 
c.circle(105*mm, 200*mm, 60*mm) 
c.showPage() 

# Radial gradient constrained within the circle. 
c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow), extend=False) 
c.drawString(5*mm, 290*mm, "c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow), extend=False)") 
c.circle(105*mm, 200*mm, 60*mm) 
c.showPage() 

# Radial gradient with multiple stops. 
c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow, green), (0, 0.8, 1)) 
c.drawString(5*mm, 290*mm, "c.radialGradient(105*mm, 200*mm, 60*mm, (red, yellow, green), (0, 0.8, 1))") 
c.circle(105*mm, 200*mm, 48*mm) 
c.circle(105*mm, 200*mm, 60*mm) 
c.showPage() 

c.save() 

này kết quả đầu ra sáu trang với gradient khác nhau cộng với phương pháp gọi gradient và dòng/vòng tròn thể hiện nơi các điểm cuối và điểm dừng là:

Basic linear gradient extending over page Linear gradient constrained within endpoints Linear gradient with multiple stops Basic radial gradient extending over page Radial gradient constrained within radius Radial gradient with multiple stops

0

Bạn muốn điền vào một hình chữ nhật (o r đường dẫn khác) với gradient thay vì một màu đồng nhất?

Không sao cả. Sử dụng clipping để giới hạn/giới hạn gradient thành đường dẫn. Chỉ cần nhớ đặt đường dẫn clip trước khi thiết lập độ dốc của đường viền. (Và quấn nó bên trong saveState()/restoreState() để đặt lại clip và độ dốc sau đó.)

c = canvas.Canvas (filename) 
#c.translate (8*cm, 8*cm) # use this to move the rectangle 
p = c.beginPath() 
p.rect (0,0 , 5*cm,5*cm) 
c.clipPath (p, stroke=0) 
c.linearGradient (0,0 , 5*cm, 5*cm , (red, yellow)) 

Đối với gradient xuyên tâm nó có thể là đủ để thiết lập các thông số extend từ khóa để False.

+0

Trong khi có thông tin hữu ích ở đây, nó phải giải quyết câu hỏi thực tế, không phải là câu hỏi đặt ra trong câu trả lời khác. –

+0

@ ZAD-Man Vâng, trừ khi bạn muốn lấp đầy toàn bộ trang với một gradient tuyến tính, bạn phải sử dụng đường cắt (AFAIK). Tôi khá chắc chắn hầu hết các trường hợp sử dụng liên quan đến việc lấp đầy các vùng của trang. Tôi không phải là một fan hâm mộ giải thích về những gì mọi người nói/viết. Tôi thường trả lời những gì tôi _think_ áp phích đang cố gắng hỏi/làm/tìm ra. Và khi tôi làm; Tôi bắt đầu câu trả lời bằng cách nêu rõ cách tôi giải thích câu hỏi. –

+0

Vâng, những gì tôi đề cập đến là một thực tế là câu trả lời của bạn đang trả lời "câu trả lời" đã bị xóa ngay bây giờ mà lẽ ra phải là một câu hỏi mới. Trích dẫn của bạn ngay từ đầu được lấy từ câu trả lời đã xóa đó. Giống như tôi nói, có thông tin tốt ở đây, nhưng nó phải được chỉnh sửa để loại bỏ các tham chiếu đến "câu trả lời" khác, để giảm sự nhầm lẫn tiềm năng, đặc biệt là hiện tượng khác đã bị xóa. –

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