Спасибо Адриану за показ того, как предполагается использовать API растеризатора Batik. Однако мне нужно было более легкое решение - я не могу писать во временные файлы и хочу меньше зависимостей. Итак, начиная с методов, на которые он указывал, я нашел способ доступа к низкоуровневому коду для преобразования и ничего больше.
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, сохраняя дополнительный шаг.
Эта версия также ничего не записывает в stdout / stderr, в отличие от высокоуровневого API.
Для вывода в формате JPEG, PNG или TIFF замените org.apache.fop.svg.PDFTranscoder
на org.apache.batik.transcoder.image.JPEGTranscoder
, PNGTranscoder
или TIFFTranscoder
(обратите внимание, что эти растровые форматы находятся в другом пакете).
(Я не совсем уверен, как Java находит классы org.apache.batk.transcoder.*
и org.apache.fop.svg.PDFTranscoder
, поскольку я не вижу их в batik-rasterizer.jar
.)
Edit:
Хотя простая компиляция из командной строки работает только с batik-rasterizer.jar
, она выполняет какую-то магию загрузчика классов, чтобы найти все необходимые классы. В более реалистичном случае (создание проекта с помощью Ant) вы должны найти классы вручную. Их можно найти в batik-1.7.zip
из проекта Batik и fop-1.1.zip
из проекта FOP . От 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