2012-03-16 16 views
4

でフォントarial.ttfのを見つけない:ApacheのFOP私が使用して1.0

  • のApache FOP 1.0
  • のJava

私はユニコードがU0100よりも高くなっている特殊文字を処理する必要があります。私が使用するターゲットフォントはArialです。 Arialがターゲットプラットフォーム(Linuxなど)に存在するとは思えないので、私は自分のjarファイルにArial.ttfを埋め込んだ。 私の実際の設定ファイルは、次のようになります。

<fop ...> 
<!-- Base URL for resolving relative URLs --> 
<base>./</base> 

<!-- Font Base URL for resolving relative font URLs --> 
<font-base>./</font-base> 

<renderers> 
    <renderer mime="application/pdf"> 
     <fonts> 

      <font kerning="yes" embed-url="arial.ttf" encoding-mode="auto"> 
       <font-triplet name="Arial" style="normal" weight="normal"/> 
       <font-triplet name="ArialMT" style="normal" weight="normal"/> 
      </font> 

      <!--<directory>C:/Windows/Fonts</directory>--> 

     </fonts> 
     <auto-detect/> 
    </renderer> 
... 
</fop> 

私はFOPに私の設定ファイルをロードし、エラーを取得し、それをこのように行う:

org.apache.fop.apps.FOPException: Failed to resolve font with embed-url 'arial.ttf' 

唯一の方法は、私はそれをするまで仕事を得るために管理しました今度は、フォルダパスを設定ファイルにハードコードすることです:

  <font kerning="yes" embed-url="C:/myapp/arial.ttf" encoding-mode="auto"> 
       <font-triplet name="Arial" style="normal" weight="normal"/> 
       <font-triplet name="ArialMT" style="normal" weight="normal"/> 
      </font> 

しかし、明らかにこれは解決策にはなりません!

「ディレクトリ」タグを使用すると、Windows上で動作します。そこにはArialがあるからです。しかし、上記のように、Linux、Macなどでも実行する必要があります。

「自動検出」タグは(Windowsではなく)動作しませんでした。 Arialがインストールされたプラットフォーム。

これを解決するための提案はありますか?

答えて

0

あなたは<フォント>タグの外に<自動検出/ >を持っています。私たちのフォントの問題を解決するために、<の自動検出/ >をのフォント>タグの中に入れます。 我々は追加の<フォント>構成を使用するが、ちょうど<自動検出/ >

1

This solution私のために動作しませんで検出されたシステムフォントを使用しないでください。 がnullを返すためです。

another solutionが見つかりましたが、別の問題があります。絶対的なシステムパス(たとえば、ユーザーによって選択された画像)を使用してFOPに追加するリソースがある場合は、カスタムURIResolver彼らは間違って解決されます。あなたはこれらの例を修正したい場合は

ちょうどそれらをミックスし、あなたはこのようなソリューションを働いてきている。

import java.io.InputStream; 
import javax.xml.transform.Source; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.URIResolver; 
import javax.xml.transform.stream.StreamSource; 

public class ClasspathUriResolver implements URIResolver { 

    @Override 
    public Source resolve(String href, String base) throws TransformerException { 
     Source source = null; 
     InputStream inputStream = getClass().getResourceAsStream(href); 
     if (inputStream != null) { 
      source = new StreamSource(inputStream); 
     } 
     return source; 
    } 
} 

使用

それはあなたの問題だが、私がいることが分かった場合
[...] 

FopFactory fopFactory = FopFactory.newInstance(); 

FOURIResolver uriResolver = (FOURIResolver) fopFactory.getURIResolver(); 
uriResolver.setCustomURIResolver(new ClasspathUriResolver()); 

[...] 
0

わからないから一部のバージョンの相対パスはFop設定ファイルでは機能しません。私にとっては、絶対パス( '/'で始まる)か 'file:'のように 'file:'というパスの接頭辞のいずれかを指定すると動作しました。

関連する問題