感谢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
重要的是,TranscoderInput和TranscoderOutput可以与任何InputStream和OutputStream,不只是文件流。注意,其中一个构造函数需要一个org.w3c.dom.Document,这意味着你甚至不需要将SVG DOM序列化为SVG字符串,节省了额外的步骤。
与高级API不同,此版本也不会向stdout / stderr写入任何内容。
对于JPEG,PNG或TIFF输出,请用org.apache.batik.transcoder.image.JPEGTranscoder,PNGTranscoder或TIFFTranscoder替换org.apache.fop.svg.PDFTranscoder(请注意,这些栅格格式在不同的包中)。
(我不太确定Java如何找到org.apache.batk.transcoder。*和org.apache.fop.svg.PDFTranscoder类,因为我没有看到他们在batik-rasterizer.jar。)
编辑:
虽然简单的命令行编译只与batik-rasterizer.jar工作,但它正在做一些类加载器魔法来找到所有必要的类。在更现实的情况下(使用Ant构建项目),您必须手动找到类。它们可以从the Batik project的batik-1.7.zip和从the FOP project的fop-1.1.zip中找到。从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