2014-10-27 43 views
0

我想使用蠟染來執行SVG轉換,除了我似乎無法找到原始SVG文檔的fill屬性的值存儲在Batik TextNode元素中的位置之外,它還行。所以在我的SVG我有以下幾點:蠟染 - 如何找到TextNode的「填充」顏色?

<text x="276.1875" y="120.390625" text-anchor="middle" font="10px &quot;Arial&quot;" 
     stroke="none" fill="#ffffff" style="-webkit-tap-highlight-color: rgb(0, 0, 0); text-anchor: middle; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 10px; line-height: normal; font-family: Arial;" 
     font-size="10px" font-family="Arial"> 
    <tspan dy="3.5" >Proportion </tspan> 
</text> 

這工作得很好,但是當我使用我的自定義TextPainter(通過一個普通的橋),試圖處理TextNode我發現以下幾點:

public void paint(TextNode node, Graphics2D g2d) 
    { 
     AttributedCharacterIterator aci = node.getAttributedCharacterIterator(); 
     Paint colourInfo = (Paint)aci.getAttribute(TextAttribute.FOREGROUND); //null 
     Paint bgInfo = (Paint)aci.getAttribute(TextAttribute.BACKGROUND); //null 
     // do actual painting 
    } 

實際上,我可以通過TextAttribute和GVT自定義文本屬性查找的與顏色有關的大多數屬性都會返回null。 aci對象確實具有非空屬性的列表,但我無法弄清楚調試器中的密鑰是什麼,因爲它們都是屬性列表的關鍵字。

Graphics2D對象的現有paint屬性通常設置爲剛剛繪製的塊的顏色,這意味着如果我不更改內容,我只是讓所有文本顯示爲與背景相同的顏色,使其難以閱讀。

如何才能找到它們在原始SVG中提供的這些文本節點的顏色?

回答

0

據報這TextNode被分成TextRun S和TextRun內可以訪問AttributedCharacterIteratorPAINT_INFO屬性是這樣的:

AttributedCharacterIterator runaci = textRun.getACI(); 
char c = runaci.first(); 
TextPaintInfo tpi = (TextPaintInfo) runaci.getAttribute(PAINT_INFO); 
if (tpi == null || !tpi.visible) 
    { 
     return y; 
    } 
g2d.setPaint(tpi.fillPaint); 

TextPaintInfo包含涉及到原來的SVG數據顯示的文字。