感谢Adrian展示了Batik光栅器API应该如何使用。 但是,我需要一个更轻量级的解决scheme—我不能写入临时文件,而且我想减less依赖关系。 所以,从他指出的方法开始,我find了一种方法来访问较低级别的代码来进行转换,而不是别的。
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
重要的一点是, TranscoderInput和TranscoderOutput可以处理任何InputStream和OutputStream ,而不仅仅是文件stream。 请注意,其中一个构造函数需要一个org.w3c.dom.Document ,这意味着您甚至不需要将SVG DOM序列化为SVGstring,从而节省了额外的步骤。
与高级API不同,此版本也不会向stdout / stderr写入任何内容。
对于JPEG,PNG或TIFF输出,请将org.apache.fop.svg.PDFTranscoderreplace为org.apache.batik.transcoder.image.JPEGTranscoder , PNGTranscoder或TIFFTranscoder (请注意,这些光栅格式位于不同的包中)。
(我不太清楚Java是如何findorg.apache.batk.transcoder.*和org.apache.fop.svg.PDFTranscoder类的,因为我没有在batik-rasterizer.jar看到它们。
编辑:
虽然简单的命令行编译只适用于batik-rasterizer.jar ,但它正在做某种类加载器的魔术来find所有必要的类。 在更现实的情况下(使用Ant构build项目),您必须手动find类。 可以从Batik项目的 fop-1.1.zip和FOP项目的 fop-1.1.zipfind它们。 从蜡染,你需要与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