2016-03-08 60 views
4

我現在有使用Batik的SVGGraphics2D以下代碼:使用Batik的SVGGraphics2D時,如何設置字體家族而不是字體?

... 
final SVGGraphics2D svgGraphics2D = new SVGGraphics2D(svgGeneratorContext, false); 
svgGraphics2D.setSVGCanvasSize(new Dimension(width, height)); 
svgGraphics2D.setFont(font); 
... 

其結果是,如果font是在其上執行的代碼,正確的屬性被添加到所得的SVG文件的系統上可用的Font。但是,如果缺少字體(例如Linux機器上的「Verdana」),則會使用默認字體(添加font-family:'Dialog')。

因此,我不想指定字體,而是想要傳遞一個字體系列以便在生成的SVG中具有font-family="DejaVu Sans,Verdana,Geneva,sans-serif"。如何知道如果我沒有錯,API只接受Font參數?

我希望有比使用xslt轉換xml輸出更簡單的方法。

預先感謝您。

+0

關於賞金:我正在尋找一個通用的解決方案來添加CSS屬性,而不僅僅是字體。 SVGGraphics2D的使用是一個絕對的要求。 – GKFX

+0

https://stackoverflow.com/questions/38890844/how-to-add-an-attribute-to-an-svg-produced-by-apache-batik和https://stackoverflow.com/questions/14314035/how在程序中改變圖像在蠟染程序中的基本相同的問題,但沒有提供答案。 Batic有可能死了,只是在Apache墓地上冷靜下來,你應該尋找另一個Java + SVG庫,或者可能會徹底改變你的方法。 –

+0

@OlegEstekhin這就是它的樣子。雖然真正的答案會很棒,但我更傾向於接受某種可以完成工作的可疑黑客攻擊,只要它有點模糊不清。 – GKFX

回答

1

如果你有一個(行貨)的字體文件,說是資源,你可以這樣做:

InputStream is = SomeClass.getResourceAsStream("/fonts/DejaVu Sans.ttf"); 
    Font font = Font.createFont(Font.TRUETYPE_FONT, is); 
    GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    ge.registerFont(font); 

這是爲了傳遞其自己的字體的應用程序的通用方法。

然後在SVG中,您可以嵌入獨立svg文件的確切字體。

我不知道,這是不可能的事:

font-family="'DejaVu Sans',Verdana,Geneva,sans-serif" 

因爲這將是CSS的方式。

+0

你所描述的是OP已經擁有的一種字體。嵌入字體是解決OP問題的一種解決方法,但是我會獎勵一個解決方案,以便在出現CSS時更好地控制CSS。謝謝! – GKFX

+1

@GKFX確實我有足夠的分數。但是我想提到在沒有安裝操作系統的情況下爲應用程序提供字體的能力,以及最終svg嵌入它的能力。 CSS會很好。 –