- - PR -
JavaでSVGに変換(Batikで)したとき日本語が文字化け
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-04-13 20:27
こんにちは件名の通りの問題が発生しています。
Batikのorg.apache.batik.swing.JSVGCanvas上まででは問題なく表示できるのですが、 いざ、SVGに変換して、Adobeのプラグインなどで確認すると日本語の部分が文字化けし 「□(四角形)」になっていたり、フォントが正しく表示しなくなっていたりします。 AdobeのIllustratorとかで確認したらFont自体が表示されなくなってしまいました。 これらの文字化けの対策方法が存在するでしょうか? それとも、Batikで変換したSVGをAdobeのプラグイン上から見るというのは そもそも間違いということなのでしょうか? BatikのFontに関しての情報などがあれば、 よろしくお願いします。 環境 WinXP Professional j2sdk1.4.2_04 Apache Batik1.5.1 eclipse2.1.1 <---以下ソース---------------------------------------------> <---SVGGeneratorSample.java--------------------------------> import java.awt.*; import javax.swing.*; import java.io.*; import org.apache.batik.svggen.SVGGraphics2D; import org.apache.batik.dom.GenericDOMImplementation; import org.w3c.dom.*; public class SVGGeneratorSample extends JFrame { public SVGGeneratorSample() { super("SVGGeneratorSample"); getContentPane().setLayout(new BorderLayout()); } public static void main(String[] args) { SVGGeneratorSample frame = new SVGGeneratorSample(); DrawArea drawArea = new DrawArea(); frame.getContentPane().add(drawArea); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 600); frame.setVisible(true); DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); /** 引数 * qualifiedName - 作成する文書型の修飾名 * publicId - 外部サブセットの公開識別子 * systemId - 外部サブセットのシステム識別子 */ Document document = domImpl.createDocument(null, "svg", null); SVGGraphics2D svgGenerator = new SVGGraphics2D(document); svgGenerator.setSVGCanvasSize(new Dimension(600, 500)); drawArea.paint(svgGenerator); boolean useCSS = true; try { Writer out = new OutputStreamWriter( new FileOutputStream("SVGGeneratorSample.svg"), "UTF-8"); svgGenerator.stream(out, useCSS); } catch(IOException e) { e.printStackTrace(); } } } class DrawArea extends JComponent { public void paint(Graphics g) { g.drawLine(48, 40, 304, 224); g.setColor(Color.red); g.fillOval(224, 144, 64, 64); g.setColor(Color.blue); g.setFont(new Font("SansSerif", Font.BOLD, 20)); g.drawString("SansSerifのBOLDです", 96, 20); g.setFont(new Font("Symbol", Font.ITALIC, 30)); g.drawString("しんぼる", 96, 50); g.setFont(new Font("Serif", Font.PLAIN, 10)); g.drawString("いいいい", 96, 100); g.setFont(new Font("Dialog", Font.ITALIC, 15)); g.drawString("だいあろぐ", 96, 150); g.setFont(new Font("Monospaced", Font.BOLD, 35)); g.drawString("トゥルータイプFont", 96, 200); g.setFont(new Font("MS Gothic", Font.PLAIN, 35)); g.drawString("MSゴシックフォント", 96, 230); g.setFont(new Font("HGP行書体", Font.PLAIN, 35)); g.drawString("HGP行書体", 96, 250); g.setFont(new Font("HG正楷書体-PRO", Font.PLAIN, 35)); g.drawString("HG正楷書体-PRO", 96, 300); } } <----------------------------------------------------------> <----------------------------------------------------------> <---JSVGCanvasSample.java----------------------------------> import java.awt.*; import javax.swing.*; import java.io.*; import org.apache.batik.swing.JSVGCanvas; //拡大縮小サンプル public class JSVGCanvasSample extends JFrame { public JSVGCanvasSample() { super("JSVGCanvasSample"); getContentPane().setLayout(new BorderLayout()); } public static void main(String[] args) { JSVGCanvasSample frame = new JSVGCanvasSample(); JSVGCanvas svgCanvas = new JSVGCanvas(); File file = new File("SVGGeneratorSample.svg"); svgCanvas.setURI("file:" + file.getAbsolutePath()); Container pane = frame.getContentPane(); pane.add(svgCanvas); JPanel panel = new JPanel(new GridLayout(1, 2)); ActionMap map = svgCanvas.getActionMap(); JButton zoomInButton = new JButton( (Action)map.get(JSVGCanvas.ZOOM_IN_ACTION)); zoomInButton.setText("拡大"); panel.add(zoomInButton); JButton zoomOutButton = new JButton( (Action)map.get(JSVGCanvas.ZOOM_OUT_ACTION)); zoomOutButton.setText("縮小"); panel.add(zoomOutButton); pane.add(panel, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 600); frame.setVisible(true); } } <----------------------------------------------------------> SVGやBatikなんかの情報って少ないですよね・・・ 技術書も洋書しかないし・・・ それでは | ||||
|
投稿日時: 2004-04-14 20:36
そうですね。svgでしたら、w3cのとこ見た方が早いかもしれません。 ところでadobeではなくて、batikのデモだかサンプルにあるやつでは 見れますか? http://xml.apache.org/batik/svgviewer.html 既読かもしれませんが、フォント関連でしたら次もありました。 http://xml.apache.org/batik/ttf2svg.html あと、fopの日本語フォント使うときも たしかなんらかの設定が必要だったと思います。 解決策が同じかもしれませんので、調べてみてはいかがでしょう? | ||||
|
投稿日時: 2004-04-15 15:48
Gです。
aaさんありがとうございます。 >そうですね。svgでしたら、w3cのとこ見た方が早いかもしれません。 >ところでadobeではなくて、batikのデモだかサンプルにあるやつでは >見れますか? とりあえずBatikのデモは見れます。しかし、デモの中に日本語はありませんでした。 他の2バイト文字列も英語以外は「□(四角形)」になってみれませんでした。 >あと、fopの日本語フォント使うときも >たしかなんらかの設定が必要だったと思います。 >解決策が同じかもしれませんので、調べてみてはいかがでしょう? FOPですね。 調べてみます。 >既読かもしれませんが、フォント関連でしたら次もありました。 >http://xml.apache.org/batik/ttf2svg.html すいませんちゃんと見てませんでした。 午前中に何とか日本語Fontの表示方法がわかったので自己レスします。 Batikにはttf2SVGというのがあるので、そこからTTFファイル(True Type Font File)を引数にエンコード専用のSVGを吐き出します。 こんな感じでです。(以下、例) /////////////////////////////////////////////////////// java -jar batik-ttf2svg.jar C:\ttc\FONT02.TTF -l 0 -h 256 -id HGRGYFont02 -o FontSample.svg -testcard /////////////////////////////////////////////////////// ちなみにTTFファイルのみです。TTCファイルはできませんでした。 しかし、「BREAKTTC」というツールを使ってTTCファイルをTTFファイルに変換可能です。 こうして吐き出した。FontSample.svgのパスを日本語が表示するSVGの以下 の[>]部分に追加 <----------------------------------------------------------------------> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN' 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'> <svg style="fill-opacity:1; 〜〜〜〜〜〜 height="700"> > <style type="text/css"> > <![CDATA[ > @font-face{font-family:'HGSeikaishotaiPRO';src:url(FontSample.svg)} > ]]> > </style> <defs id="genericDefs" /> <g> > <g style="fill:blue; font-size:20; ※font-family:'HGSeikaishotaiPRO'; stroke:blue;"> <g> ※font-familyも変更 <----------------------------------------------------------------------> これでAdobeのプラグインも、Illustratorでも 「HG正楷書体」や「HGP行書体」を確認することができました。 ただ、これは全てのフォントに対してはできないです。(PostScript フォントやCIDフォントはどうなるのだろうか?) なんせTrueType専用ですから。他にPSフォントやOpenTypeフォントで 可能なのでしょうか? [ メッセージ編集済み 編集者: G 編集日時 2004-04-15 15:51 ] [ メッセージ編集済み 編集者: G 編集日時 2004-04-15 15:52 ] | ||||
1
