我正在批量创建一些SVG,需要将它们转换为PDF文档进行打印。我一直在尝试使用svglib
及其svg2rlg
方法,但我刚刚发现它在保存文档中的矢量图形方面绝对令人震惊。它几乎无法正确定位文本。
我动态生成的SVG格式正确,我在原始输入上测试了svglib
,以确保它不是我正在介绍的问题。
那么我在svglib
和ReportLab之后的选择是什么?它要么必须是免费的,要么非常便宜,因为我们已经超出了该项目的预算。我们负担不起ReportLab Plus的1k /年费用。
我正在使用Python,但在这个阶段,只要它在我们的Ubuntu服务器上运行,我就很高兴。
编辑:经过测试的王子。更好,但它仍然忽略了一半的文件。
答案 0 :(得分:8)
我使用inkscape。在您的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)
您可能需要将.svg中引用的所有字体文件作为参数传递给inkscape,因此如果您的文字在.pdf输出中没有正确显示,请记住这一点。
答案 1 :(得分:1)
import cairosvg
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')
答案 2 :(得分:1)
rst2pdf使用reportlab生成PDF。它可以使用inkscape和pdfrw来阅读PDF。
pdfrw本身有一些示例,显示阅读PDF并使用reportlab输出。
马丁在下面发表评论(我可以编辑这个答案,但是没有评论评论的声誉......):
reportlab对SVG文件一无所知。某些工具(如svg2rlg)尝试通过将它们绘制到reportlab画布中来将SVG图像重新创建为PDF。但是您可以使用pdfrw以不同的方式执行此操作 - 如果您可以使用其他工具将SVG文件转换为PDF图像,则pdfrw可以获取转换后的PDF,并将其作为表单XObject添加到您正在生成的PDF中用reportlab。就reportlab而言,它与放置JPEG图像没什么不同。
某些工具会对SVG文件造成可怕的影响(例如,光栅化它们)。根据我的经验,inkscape通常做得很好,并以矢量格式保留。你甚至可以做到无头,例如“inkscape my.svg -A my.pdf”。
我首先编写pdfrw的全部原因是针对这个确切的用例 - 能够在reportlab创建的新PDF中重用矢量图像。
答案 3 :(得分:0)
只是为了让您知道以及未来的问题,我找到了解决此问题的方法:
# 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()
享受位置(80,740 - h),它只是位置。
如果代码不起作用,您可以在render的reportlab库中查看。 您在reportlab中有一个函数可以直接从您的图像创建pdf:
renderPDF.drawToFile(rlg, "example.pdf", "title")
您可以打开并阅读它。这不是很复杂。此代码来自此函数。
答案 4 :(得分:-1)
使用svglib或cairosvg时,无法正确呈现svg中的文本。 我的解决方案是将svg文件导入draw.io,然后将其导出为pdf。