Python 将SVG转换为PDF(svglib+;reportlab不够好)

Python 将SVG转换为PDF(svglib+;reportlab不够好),python,pdf,svg,reportlab,Python,Pdf,Svg,Reportlab,我正在批量创建一些SVG,需要将它们转换为PDF文档进行打印。我一直在尝试使用svglib及其svg2rlg方法,但我刚刚发现,在我的文档中保存矢量图形绝对令人震惊。它几乎不能正确定位文本 我动态生成的SVG格式良好,我已经在原始输入上测试了svglib,以确保这不是我要介绍的问题 那么,我过去的svglib和ReportLab选项是什么?它要么是免费的,要么是非常便宜的,因为我们已经超出了这个项目的预算。我们负担不起ReportLab Plus的1k/年费用 我正在使用Python,但在这个阶

我正在批量创建一些SVG,需要将它们转换为PDF文档进行打印。我一直在尝试使用
svglib
及其
svg2rlg
方法,但我刚刚发现,在我的文档中保存矢量图形绝对令人震惊。它几乎不能正确定位文本

我动态生成的SVG格式良好,我已经在原始输入上测试了
svglib
,以确保这不是我要介绍的问题

那么,我过去的
svglib
和ReportLab选项是什么?它要么是免费的,要么是非常便宜的,因为我们已经超出了这个项目的预算。我们负担不起ReportLab Plus的1k/年费用

我正在使用Python,但在这个阶段,我很高兴它能在我们的Ubuntu服务器上运行

编辑:测试王子。更好,但它仍然忽略了文档的一半。

是我正在使用的:

import cairosvg
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')
我用这个。在django视图中,请执行以下操作:

from subprocess import Popen

x = Popen(['/usr/bin/inkscape', your_svg_input, \
    '--export-pdf=%s' % your_pdf_output])
try:
    waitForResponse(x)
except OSError, e:
    return False

def waitForResponse(x): 
    out, err = x.communicate() 
    if x.returncode < 0: 
        r = "Popen returncode: " + str(x.returncode) 
        raise OSError(r)
从子流程导入Popen
x=Popen(['/usr/bin/inkscape',您的输入\
“--导出pdf=%s”%s您的\u pdf\u输出])
尝试:
waitForResponse(x)
除O错误外,e:
返回错误
def waitForResponse(x):
out,err=x.communicate()
如果x.returncode<0:
r=“Popen returncode:”+str(x.returncode)
升起操作错误(r)

您可能需要将.svg中引用的所有字体文件作为参数传递给inkscape,因此,如果文本未正确显示在.pdf输出中,请记住这一点。

rst2pdf使用reportlab生成pdf。它可以使用inkscape和pdfrw来读取PDF

pdfrw本身有一些示例显示如何读取PDF并使用reportlab进行输出

以下是Martin的评论(我可以编辑此答案,但没有对其评论的声誉…):

reportlab对SVG文件一无所知。一些工具,如svg2rlg,试图通过将SVG图像绘制到reportlab画布中,将其重新创建为PDF。但是您可以使用pdfrw以不同的方式实现这一点——如果您可以使用其他工具将SVG文件转换为PDF图像,那么pdfrw可以将转换后的PDF作为表单XObject添加到您使用reportlab生成的PDF中。就reportlab而言,它实际上与放置JPEG图像没有什么不同

有些工具会对SVG文件造成可怕的影响(例如,光栅化它们)。根据我的经验,inkscape通常做得很好,并将它们保留为向量格式。您甚至可以无头执行此操作,例如“inkscape my.svg-A my.pdf”


我写pdfrw的全部原因首先是为了这个确切的用例——能够在reportlab创建的新PDF中重用矢量图像。

只是为了让您知道,对于未来的问题,我找到了这个问题的解决方案:

# I only install svg2rlg, not svglib (svg2rlg is inside svglib as well) 
import svg2rlg

# Import of the canvas
from reportlab.pdfgen import canvas

# Import of the renderer (image part)
from reportlab.graphics import renderPDF

rlg = svg2rlg.svg2rlg("your_img.svg")
c = canvas.Canvas("example.pdf")
c.setTitle("my_title_we_dont_care")

# Generation of the first page
# You have a last option on this function, 
# about the boundary but you can leave it as default.
renderPDF.draw(rlg, c, 80, 740 - rlg.height)
renderPDF.draw(rlg, c, 60, 540 - rlg.height)
c.showPage()

# Generation of the second page
renderPDF.draw(rlg, c, 50, 740 - rlg.height)
c.showPage()

# Save
c.save()
享受一下这个位置(80740-h),它只是这个位置

如果代码不起作用,可以查看渲染器的reportlab库。 reportlab中有一个函数可以直接从图像创建pdf:

renderPDF.drawToFile(rlg, "example.pdf", "title")

你可以打开并阅读它。这不是很复杂。此代码来自此函数。

使用svglib或cairosvg时,svg中的文本无法正确呈现。
我的解决方案是将svg文件导入draw.io,然后将其导出为pdf。

您是否可以使用以下方法的组合,后者使用reportlab,但我想知道如果您只是生成pdf,是否可以不使用Plus版本。您可以直接使用Cairo进入pdf,但我不能肯定,因此会有评论而不是答案。现在测试它,但不幸的是,它在呈现我的SVG方面同样薄弱。您确定SVG的格式确实正确吗?Cairo的渲染非常可靠。。另外,我正在使用WeasyPrint for PDF,虽然它仍然有点不完整,但尽管有一些限制,它仍然可以正常工作……这是如何解决OP的问题的?我相信他不想使用reportlab,因为它缺乏SVG处理质量。inkscape处理字体的能力好吗?安装在windows环境中的字体是否可以在inkscape中识别?@ShanerM13 inkscape可以很好地处理字体。我没有在Windows上使用Inkscape,但第二个问题的答案似乎是。