python-3.x 无法使用svglib将svg转换为png

gmxoilav  于 2023-02-01  发布在  Python
关注(0)|答案(2)|浏览(264)

当我转换svg到png我得到一个不完整的png文件和错误。请有人帮助。

from reportlab.graphics import renderPM
from svglib.svglib import svg2rlg

svg_file = 'svgfile.svg'

drawing = svg2rlg(svg_file)
renderPM.drawToFile(drawing, "new_file.png", fmt="PNG")
Can't handle color: url(#a)
Can't handle color: url(#b)
Can't handle color: url(#c)
piah890a

piah890a1#

不确定这对您的情况是否有帮助,但它回答了我的问题(同样是“无法处理颜色:url(...)”消息。
来自svglib PyPi文档(https://pypi.org/project/svglib/):
不支持颜色渐变(reportlab的限制)
在我的例子中,这些颜色是渐变色,所以我将把svg转换成png,然后通过Python脚本把png图像嵌入到pdf中,这不是我想要的理想效果,但png解决方案满足了我的要求。

5vf7fwbs

5vf7fwbs2#

1.使用findall()和XPath表达式,使用内置的xml.etree.ElementTree库在svg文件中搜索线性渐变。
1.通过选择第一个属性“stop-color”提取纯色。
1.提取“id”属性以搜索使用相应梯度的树。
1.搜索树并用先前获得的纯色覆盖属性“fill”。
(At目前它只寻找线性梯度,并只以第一种颜色作为模板。该脚本可以扩展为其他梯度类型和一个方法,提取多种颜色,以建立一个平均颜色作为模板。)

import xml.etree.ElementTree as ET
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPDF

# Remove gradients from svg file and replace them by solid color
# First open the svg file to be modified
tree = ET.parse("Graphs-Screenshot.svg")
root = tree.getroot()

# Search for the linearGradient tag within the svg file
for descendant in root.findall("{*}defs/{*}linearGradient"):
    print(descendant)
    id = descendant.get("id")
    print("id: " + id)

    # Extract the (first) color of the gradient as template
    # for solid color fill.
    # Might be extended to extract average of multiple colors
    color = descendant[0].get("stop-color")
    print("color: " + color)
    print("{*}g/{*}"+id)

    # Replace all gradients with previously extracted solid color
    for gradient in root.iterfind("{*}g/"):
        if gradient.get("fill") == ("url(#"+id+")"):
            print("old gradient:", gradient.get("fill"))
            gradient.set("fill", color)
            print("new solid color:", gradient.get("fill"))
    
# Save the edited svg file
tree.write("newSVG.svg", encoding="UTF-8")

# Convert svg to reportlab own rlg format
rlg = svg2rlg("newSVG.svg")
# Save a PDF out of rlg file
renderPDF.drawToFile(rlg, "Graphs-Screenshot.pdf")

代码也可以在这里找到:https://github.com/DrakeGladiator/SVGGradientRemover

相关问题