【问题标题】:Convert SVG to PDF (svglib + reportlab not good enough)将 SVG 转换为 PDF(svglib + reportlab 不够好)
【发布时间】:2012-02-09 19:58:48
【问题描述】:

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

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

那么,除了svglib 和 ReportLab,我还有哪些选择?它要么必须是免费的,要么必须非常便宜,因为我们已经超出了这个项目的预算。我们负担不起 ReportLab Plus 每年 1k 的费用。

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

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

【问题讨论】:

标签: python pdf svg reportlab


【解决方案1】:

我为此使用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 输出中显示不正确,请记住这一点。

【讨论】:

  • inkscape 能很好地处理字体吗?安装在 windows 环境下的字体是否被inkscape 识别?
  • @ShanerM13 Inkscape 确实可以很好地处理字体。我没有在 Windows 上使用过 Inkscape,但您第二个问题的答案似乎是 yes, if done correctly
【解决方案2】:

CairoSVG 是我正在使用的:

import cairosvg
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')

【讨论】:

  • 现在测试了,但不幸的是它在渲染我的 SVG 时同样虚弱。
  • 您确定您的 SVG 格式确实正确吗? Cairo 的渲染非常可靠。另外,我正在使用 Wea​​syPrint 处理 PDF,虽然它仍然有点不完整,但尽管有限制,但效果很好......
【解决方案3】:

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

pdfrw 本身有一些示例显示阅读 PDF 和使用 reportlab 输出。

解决下面马丁的评论(我可以编辑这个答案,但没有评论评论的声誉......):

reportlab 对 SVG 文件一无所知。一些工具,如 svg2rlg,试图通过将 SVG 图像绘制到 reportlab 画布中来将它们重新创建为 PDF。但是您可以使用 pdfrw 以不同的方式执行此操作——如果您可以使用其他工具将 SVG 文件转换为 PDF 图像,那么 pdfrw 可以获取转换后的 PDF,并将其作为表单 XObject 添加到您正在生成的 PDF 中与报告实验室。就reportlab而言,其实和放一张JPEG图片没什么区别。

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

我最初编写 pdfrw 的全部原因就是为了这个确切的用例——能够在 reportlab 创建的新 PDF 中重复使用矢量图。

【讨论】:

  • 这如何解决 OP 的问题?我相信他不会想要使用reportlab,因为它的SVG处理质量欠佳。
【解决方案4】:

只是为了让你知道,为了以后的问题,我找到了解决这个问题的方法:

# 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)有点享受,只是位置而已。

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

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 2011-05-06
      • 2016-05-23
      • 2011-10-06
      • 2019-07-01
      • 2019-02-15
      相关资源
      最近更新 更多