SVGファイルをPDFプログラムで変換するにはどうすればよいですか?(PDFを生成する前に、特定の点でSVGを変更する必要があるため、ツールを使用して変換するだけでは不十分です。)
理想的には、Javaを使用しますが、PerlまたはPHPを使用することもできます。
明らかに、私は基本的にApache FOPとJavaでのBatikを検討しています。しかし、どれだけ長く検索しても、簡単な紹介はありません。 SVGConverter のようなものには、「GraphicContextの一部またはすべてを変換できるクラスのインターフェースを定義する」のような説明がありますが、それが何を意味するのか本当にわかりません。
FOPまたはBatikによって提供される、これを非常に簡単に行うためのAPIが必要だと私は感じていますが、現時点ではそれを見つけることができません(またはおそらく実際には存在しません)。
私が必要とするサポートされているSVG機能に関しては、ファイルにはいくつかの線形グラデーションで満たされたパスがいくつかあります。
理想的には、DOMドキュメントとしてSVGを渡すことができれば理想的です。次に、テンプレートSVGファイルをロードし、ユーザーの指定に従って変更してから、PDFを生成します。
BatikラスタライザAPIの使用方法を示してくれたAdrianに感謝します。ただし、より軽量なソリューションが必要でした。一時ファイルに書き込むことができず、依存関係を減らしたいと考えています。そこで、彼が指摘したメソッドから始めて、変換を行うために下位レベルのコードにアクセスする方法を見つけました。
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
、ファイルストリームだけではありません。コンストラクターの1つが 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がorg.Apache.batk.transcoder.*
およびorg.Apache.fop.svg.PDFTranscoder
クラスを見つける方法がよくわかりません。batik-rasterizer.jar
には表示されないためです。)
編集:
単純なコマンドラインコンパイルはbatik-rasterizer.jar
でのみ機能しますが、必要なクラスをすべて見つけるために、なんらかのクラスローダーマジックを実行しています。より現実的なケース(Antでプロジェクトをビルドする)では、クラスを手動で見つける必要があります。これらはbatik-1.7.Zip
from the Batik project およびfop-1.1.Zip
from FOP project にあります。 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
私はようやく Batik を使用してこれを解決するための適切なコード行を見つけることができました。
あなたはSVGファイルとその結果のPDF=をディスク上にファイルとして持っている必要があります、すなわち私はそれをインメモリで行う方法を見つけることができませんでした(私はHTTPサーブレットを書いているので本質的には何もファイルとして書き込む必要はありません。理想的には、結果をHTTPクライアントにストリーミングします。 File.createTemporaryFile を使用してファイルを作成し、SVGをファイルにダンプします。結果としてPDFが書き込まれます。
したがって、使用した行は次のとおりです。
import org.Apache.batik.apps.rasterizer.DestinationType;
import org.Apache.batik.apps.rasterizer.SVGConverter;
import ...
// SVG available as a DOM object (created programatically by my program)
Document svgXmlDoc = ...
// Save this SVG into a file (required by SVG -> PDF transformation process)
File svgFile = File.createTempFile("graphic-", ".svg");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source2 = new DOMSource(svgXmlDoc);
FileOutputStream fOut = new FileOutputStream(svgFile);
try { transformer.transform(source2, new StreamResult(fOut)); }
finally { fOut.close(); }
// Convert the SVG into PDF
File outputFile = File.createTempFile("result-", ".pdf");
SVGConverter converter = new SVGConverter();
converter.setDestinationType(DestinationType.PDF);
converter.setSources(new String[] { svgFile.toString() });
converter.setDst(outputFile);
converter.execute();
そして、私は以下のJARを持っています(Googleを使用してプロジェクトを見つけてダウンロードします):
svgとpdfをレンダリングするにはlibrayが必要です。前者には SVG salamander を、後者には iText をお勧めします。 svg salamanderを使用すると、svgを読み取って画像オブジェクトを作成でき、itextを使用すると、その画像をPDFに書き込むことができます。
Altsoft Xml2PDFを使用しています。私がすべてのニーズと要件を正しく理解している場合は、Xml2PDFのサーバーバージョンを試してみてください。
必要なのはphantomjsだけです。このために扱いにくいバティックはまったく必要ありません。 pdfのURLをソースとして使用し、場所を出力として使用して、phantomjsを実行し、rasterize.jsを呼び出すことができるようになります。 .pdfで何をしたいかに応じて、Javaは必要ありません。
http://phantomjs.org/screen-capture.html
「PNG形式のほかに、PhantomJSはJPEG、GIF、PDFをサポートしています」で始まる部分を見てください。