如何以编程方式将SVG文件转换为PDF? (在生成PDF之前,我需要在某些方面进行更改,因此仅使用工具进行预转换就不够了。)

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

显然,我基本上是在考虑使用Java的Apache FOP和Batik。但是,无论我搜索多长时间,都无法找到有关该操作方法的简单介绍。诸如SVGConverter之类的描述具有诸如“定义能够转换部分或全部GraphicContext的类的接口”之类的描述,但是我真的不知道这意味着什么。

我有一种感觉,必须有一个由FOP或Batik提供的非常简单的API来执行此操作,但是我暂时无法找到它(或者也许它确实不存在)。

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

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

最佳答案

感谢Adrian展示了应该如何使用Batik光栅化器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


重要的一点是TranscoderInputTranscoderOutput可以与任何InputStreamOutputStream一起使用,而不仅仅是文件流。请注意,其中一个构造函数采用org.w3c.dom.Document,这意味着您甚至不需要将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构建项目),您必须手动查找类。可以在the Batik projectbatik-1.7.zipthe FOP projectfop-1.1.zip中找到它们。在蜡染中,您需要使用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

08-06 06:40