代码之家  ›  专栏  ›  技术社区  ›  Duncan Lock

共享Linux服务器上的SVG到PDF

  •  13
  • Duncan Lock  · 技术社区  · 16 年前

    我有一个网站,使用SVG的互动客户端Thingamabob。我想提供下载已完成输出的PDF文件的选项。我可以将最终的SVG输出传递回服务器,在那里我想转换成PDF,然后将其返回到客户机进行下载。

    这需要在无头共享Linux服务器上工作,在该服务器上安装或编译是一个巨大的难题,或者是不可能的。网站是php,所以理想的解决方案是php,或者使用易于安装在共享Web服务器上的软件。可以使用python、perl和ruby,以及在Linux设备上可能会遇到的常见问题。涉及cairo、Inkscape脚本编写或安装比“ftp-it-up”更复杂的解决方案可能已经过时。当然,花大量的钱也是不可能的。由于这是一个共享服务器,内存和/或CPU占用的解决方案也会被淘汰,因为它们往往会被淘汰;这或多或少地排除了Batik。

    到目前为止,离我最近的是 this XSL transform 我可以从PHP中驱动它,然后通过ps2pdf(已经安装)喷射生成的PostScript。唯一的问题是,它不支持SVG路径——如果支持的话,它将是完美的。

    StackOverflow上有一堆或相关的问题,我已经通读了所有这些问题,但它们都假定您可以安装东西、花钱,或者两者都可以。

    是否有人有现成的解决方案来解决这个问题,或者我应该花一些时间尝试向XSL转换添加路径支持?

    谢谢, 邓肯

    5 回复  |  直到 9 年前
        1
  •  16
  •   Duncan Lock    13 年前

    我今天偶然发现了tcpdf,如果当时我知道的话,它将是完美的。它只是纯PHP类的集合,对大多数事情都没有外部依赖性。

    它可以从头开始构建PDF,您可以在其中包含几乎所有您想要的内容,包括SVG(其中包括许多其他内容),如以下示例所示:

    http://www.tcpdf.org/examples.php

    主要项目页面如下:

    http://www.tcpdf.org/

    SourceForge页面如下:

    http://sourceforge.net/projects/tcpdf/

        2
  •  3
  •   Alex Brown    16 年前

    你可以使用 Apache FOP 自由的 Batik SVG工具包 transcoder api 将SVG转换为PDF。

    download link

    您将需要编写一小段Java。有代码示例 here _ org.apache.fop.svg.PDFTranscoder 而不是Java。

    您应该能够做到这一点,而不需要在您的机器上安装任何东西,只需拖动那里的罐子并运行一个脚本。我引述:

    巴蒂克需要的所有其他图书馆都包含在发行版中。因此,Batik存档相当大,但是在下载之后,您将不需要任何其他东西。

        3
  •  2
  •   Alex Brown    16 年前

    你看过吗 imagemagick ?我想你也需要 ghostscript 完成循环,这可能会使安装困难和性能成为问题。

        4
  •  2
  •   Erik Dahlström    16 年前

    我建议给予 princexml 一次尝试,他们提供 various addons (包括一个用于PHP)并且可以从svg/html/xml输出pdf。

        5
  •  0
  •   Star Daniel Samson    9 年前

    我用过TCPDF( http://www.tcpdf.org/ )在许多项目中,它几乎在每个用例中都起作用。

    以下是SVG的示例: https://tcpdf.org/examples/example_058/

    下面的代码可以帮助您:

    $pdf->ImageSVG($file='images/testsvg.svg', $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false);
    
    $pdf->ImageSVG($file='images/tux.svg', $x=30, $y=100, $w='', $h=100, $link='', $align='', $palign='', $border=0, $fitonpage=false);