有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将SVG转换为PDF

如何通过编程将SVG文件转换为PDF?(在生成PDF之前,我需要在某些方面修改SVG,因此仅使用工具对其进行预转换是不够的。)

理想情况下使用Java,但也可以使用Perl或PHP

显然,我基本上是在考虑使用Java的ApacheFop和Batik。然而,无论我搜索多长时间,我都找不到一个简单的介绍如何做。像SVGConverter这样的东西有“为能够转换部分或全部GraphicContext的类定义接口”这样的描述,但我真的不知道这意味着什么

我有这样的感觉,必须有一个API来做这件事非常简单,由FOP或Batik提供,但我只是无法找到它目前(或者它真的不存在)

就我所需要的支持的SVG特性而言,该文件有一些路径,其中填充了一些线性渐变

理想情况下,如果我能将SVG作为DOM文档传入,那将是理想的;然后,我将加载我的模板SVG文件,根据用户的指定对其进行更改,然后生成PDF


共 (5) 个答案

  1. # 1 楼答案

    我终于找到了合适的代码行,用Batik解决了这个问题

    您需要将SVG文件和生成的PDF作为文件放在磁盘上,也就是说,我找不到在内存中执行此操作的方法(我正在编写一个HTTP Servlet,因此我不需要将任何内容作为文件写入,理想情况下,我会将结果流式传输到HTTP客户端)。我使用File.createTemporaryFile创建了一个文件,将SVG转储到一个文件中,并将生成的PDF写入其中

    因此,我使用的行如下所示:

    import org.apache.batik.apps.rasterizer.DestinationType;
    import org.apache.batik.apps.rasterizer.SVGConverter;
    import ...
    
    // SVG available as a DOM object (created programatically by my program)
    Document svgXmlDoc = ...
    
    // Save this SVG into a file (required by SVG -> PDF transformation process)
    File svgFile = File.createTempFile("graphic-", ".svg");
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    DOMSource source2 = new DOMSource(svgXmlDoc);
    FileOutputStream fOut = new FileOutputStream(svgFile);
    try { transformer.transform(source2, new StreamResult(fOut)); }
    finally { fOut.close(); }
    
    // Convert the SVG into PDF
    File outputFile = File.createTempFile("result-", ".pdf");
    SVGConverter converter = new SVGConverter();
    converter.setDestinationType(DestinationType.PDF);
    converter.setSources(new String[] { svgFile.toString() });
    converter.setDst(outputFile);
    converter.execute();
    

    我有以下JAR(使用Google搜索并下载项目):

    • avalon-framework-4.2.0。罐子
    • 蜡染-all-1.7。罐子
    • commons-io-1.3.1。罐子
    • commons-logging-1.0.4。罐子
    • fop-0.95。罐子
    • log4j-1.2.15。罐子
    • xml-api-ext.jar
    • xmlgraphics-commons-1.3.1。罐子
  2. # 2 楼答案

    你所需要的只是幻影。你根本不需要笨重的蜡染;只需运行phantomjs,调用光栅化即可。js,使用pdf的url作为源,使用位置作为输出。这取决于你想用它做什么。pdf,您甚至不需要Java

    http://phantomjs.org/screen-capture.html

    请看以“除PNG格式外,PhantomJS支持JPEG、GIF和PDF”开头的部分

  3. # 3 楼答案

    您需要一个库来呈现svg和pdf。 我建议前者采用SVG salamander,后者采用iText。使用svg salamander,您可以读取svg并创建图像对象,使用itext,您可以将图像写入pdf

  4. # 4 楼答案

    我使用AltsoftXML2PDF。如果我正确理解了您的所有需求,您最好试试他们的服务器版本的Xml2PDF

  5. # 5 楼答案

    感谢Adrian展示了蜡染光栅化器API应该如何使用。然而,我需要一个更轻量级的解决方案——我不能写入临时文件,并且我想要更少的依赖项。因此,从他指出的方法开始,我找到了一种方法来访问较低级别的代码来进行转换,而不做其他事情

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    import org.apache.batik.transcoder.Transcoder;
    import org.apache.batik.transcoder.TranscoderException;
    import org.apache.batik.transcoder.TranscoderInput;
    import org.apache.batik.transcoder.TranscoderOutput;
    import org.apache.fop.svg.PDFTranscoder;
    
    public class Test {
        public static void main(String[] argv) throws TranscoderException, FileNotFoundException {
            Transcoder transcoder = new PDFTranscoder();
            TranscoderInput transcoderInput = new TranscoderInput(new FileInputStream(new File("/tmp/test.svg")));
            TranscoderOutput transcoderOutput = new TranscoderOutput(new FileOutputStream(new File("/tmp/test.pdf")));
            transcoder.transcode(transcoderInput, transcoderOutput);
        }
    }
    

    编译和运行命令是

    javac -cp batik-rasterizer.jar -d build Test.java
    java -cp build:batik-rasterizer.jar Test
    

    重要的一点是^{}^{}可以处理任何^{}^{},而不仅仅是文件流。注意,其中一个构造函数使用^{},这意味着您甚至不需要将SVG DOM序列化为SVG字符串,从而节省了额外的步骤

    与高级API不同,此版本也不向stdout/stderr写入任何内容

    对于JPEG、PNG或TIFF输出,将org.apache.fop.svg.PDFTranscoder替换为org.apache.batik.transcoder.image.JPEGTranscoderPNGTranscoderTIFFTranscoder(请注意,这些光栅格式位于不同的包中)

    (我不太确定Java是如何找到org.apache.batk.transcoder.*org.apache.fop.svg.PDFTranscoder类的,因为我在batik-rasterizer.jar中没有看到它们。)

    编辑:

    尽管简单的命令行编译只对batik-rasterizer.jar有效,但它正在执行某种类装入器魔法来查找所有必需的类。在更现实的情况下(使用Ant构建项目),必须手动查找类。它们可以在来自{a6}的{}和来自{a7}的{}中找到。在Batik中,您需要使用batik-transcoder.jar编译并使用运行

    • batik-transcoder.jar
    • batik-anim.jar
    • batik-awt-util.jar
    • batik-bridge.jar
    • batik-css.jar
    • batik-dom.jar
    • batik-ext.jar
    • batik-gvt.jar
    • batik-parser.jar
    • batik-script.jar
    • batik-svg-dom.jar
    • batik-util.jar
    • batik-xml.jar
    • xml-apis-ext.jar

    在FOP中,您需要使用fop.jar编译并使用运行

    • fop.jar
    • avalon-framework-4.2.0.jar
    • xmlgraphics-commons-1.5.jar