是否可以使用ReportLab(python)在PDF中創建漸變填充?使用reportlab創建PDF文件的漸變填充
回答
[我的回答不再是正確的,現在梯度可在ReportLab的,看到這個頁面的詳細信息,對方的回答。]
抱歉ressurect這個問題,但我偶然發現了它,它hadn沒有被正確回答。
答案是否定的,截至今日,ReportLab的當前版本不支持漸變。但是,PDF支持漸變。如果你看看ReportLab的Canvas類,你會發現它的很多方法都是基礎PDF代碼生成的相對較小的包裝。要訪問RL中的漸變,您需要擴展Canvas類並添加其他方法來生成正確的PDF代碼。這是可行的,但顯然不是微不足道的,這意味着你必須閱讀PDF規範。
有兩種選擇。首先生成漸變作爲光柵圖像並使用它,其次通過繪製一系列不同顏色的矩形生成漸變。
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)
例如,不幸的是,漸變平滑需要大量的矩形,這可能會導致PDF變大並呈現緩慢。採用柵格方法會更好。
最後,你可能會考慮使用PyCairo。這更好地支持大量的圖形元素,並可以呈現爲PDF或PNG。但是,它缺少reportlabs高級槓桿結構(如頁面佈局)。
ReportLab現在支持PDF漸變。
Peter Johnson在2012年8月6日爲posted to the ReportLab mailing list提供了梯度支持補丁,第二天是added to the source。我不能在the release notes for ReportLab 2.6中發現任何東西,但是自2012年10月1日發佈以來,它可能在那裏。它絕對存在於2.7中。
可以指定具有多個停止點的線性和徑向梯度。在文檔中搜索梯度沒有任何變化。然而,message with the first version of the patch有幾個例子,它們是some tests in the ReportLab source的基礎。在此基礎上我已經工作了一個快速演示腳本:
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()
此輸出六頁各種梯度加梯度方法調用和線/圓圈表示在端點和站是:
要填充矩形(鄰r其他路徑)用漸變代替 一個純色?
沒問題。使用剪裁將漸變綁定/限制到路徑。請記住在設置漸變之前在之前設置剪輯路徑。 (並將其包裹在saveState()
/restoreState()
之後以重置剪輯和漸變。)
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))
對於徑向梯度可能是足夠的extend
關鍵字參數設置爲False
。
- 1. 使用[UIColor colorWithPatternImage:]爲文本創建漸變填充
- 2. 如何創建UIBezierPath漸變填充?
- 3. PDF生成庫支持漸變填充
- 4. 使用石英填充PNG的漸變
- 5. 用漸變填充geom_tile
- 6. SVG使用和漸變作爲填充
- 7. 使用jQuery進行漸變填充?
- 8. C#使用pdf文件填充treeview
- 9. 石英:無法創建帶漸變填充的圓角矩形
- 10. jVectormap漸變背景填充
- 11. Quartz2d漸變填充橢圓
- 12. 如何填充漸變
- 13. 矩形漸變填充
- 14. 樣條圖漸變填充
- 15. MPAndroidChart填充顏色漸變
- 16. 漸變不填充IBDesignable UIView
- 17. 使用ReportLab生成橫向PDF文件
- 18. 如何在python中使用reportlab填充可填充表格
- 19. 使用CSS3在文本上創建雙色漸變漸變
- 20. 在PHP中創建PDF填充表格
- 21. 用漸變填充百分比
- 22. 如何用漸變填充matplotlib欄?
- 23. 在iOS上用漸變填充路徑
- 24. ggplot漸變填充不起作用
- 25. 如何用傾斜漸變填充CAShapeLayer?
- 26. SVG漸變填充不起作用
- 27. 用線性漸變填充畫布
- 28. vb6:用漸變填充多邊形
- 29. 簡單地創建一個新的控件後,舞臺失去填充(漸變)
- 30. 使用UTF-8填充的HTML字符串創建PDF表格
儘管這裏有有用的信息,但它應該解決實際問題,而不是在另一個答案中提出的問題。 – 2014-06-19 20:32:25