web-dev-qa-db-ja.com

SVGをPDFに変換します

SVGファイルをPDFプログラムで変換するにはどうすればよいですか?(PDFを生成する前に、特定の点でSVGを変更する必要があるため、ツールを使用して変換するだけでは不十分です。)

理想的には、Javaを使用しますが、PerlまたはPHPを使用することもできます。

明らかに、私は基本的にApache FOPとJavaでのBatikを検討しています。しかし、どれだけ長く検索しても、簡単な紹介はありません。 SVGConverter のようなものには、「GraphicContextの一部またはすべてを変換できるクラスのインターフェースを定義する」のような説明がありますが、それが何を意味するのか本当にわかりません。

FOPまたはBatikによって提供される、これを非常に簡単に行うためのAPIが必要だと私は感じていますが、現時点ではそれを見つけることができません(またはおそらく実際には存在しません)。

私が必要とするサポートされているSVG機能に関しては、ファイルにはいくつかの線形グラデーションで満たされたパスがいくつかあります。

理想的には、DOMドキュメントとしてSVGを渡すことができれば理想的です。次に、テンプレートSVGファイルをロードし、ユーザーの指定に従って変更してから、PDFを生成します。

28
Adrian Smith

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.PDFTranscoderorg.Apache.batik.transcoder.image.JPEGTranscoderPNGTranscoder、または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
18
Jim Pivarski

私はようやく 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を使用してプロジェクトを見つけてダウンロードします):

  • avalon-framework-4.2.0.jar
  • batik-all-1.7.jar
  • commons-io-1.3.1.jar
  • commons-logging-1.0.4.jar
  • fop-0.95.jar
  • log4j-1.2.15.jar
  • xml-apis-ext.jar
  • xmlgraphics-commons-1.3.1.jar
5
Adrian Smith

svgとpdfをレンダリングするにはlibrayが必要です。前者には SVG salamander を、後者には iText をお勧めします。 svg salamanderを使用すると、svgを読み取って画像オブジェクトを作成でき、itextを使用すると、その画像をPDFに書き込むことができます。

4
S E

Altsoft Xml2PDFを使用しています。私がすべてのニーズと要件を正しく理解している場合は、Xml2PDFのサーバーバージョンを試してみてください。

1
Nat

必要なのはphantomjsだけです。このために扱いにくいバティックはまったく必要ありません。 pdfのURLをソースとして使用し、場所を出力として使用して、phantomjsを実行し、rasterize.jsを呼び出すことができるようになります。 .pdfで何をしたいかに応じて、Javaは必要ありません。

http://phantomjs.org/screen-capture.html

「PNG形式のほかに、PhantomJSはJPEG、GIF、PDFをサポートしています」で始まる部分を見てください。

1
Sandy Simonton