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