AdobeフォントをIE9のCSS3 @ font-faceで動作させる


132

小さなイントラネットアプリケーションを作成している最中ですが、最近購入したAdobeフォントを使用しようとしました。私が知らされたように、私たちの場合、それはライセンス違反ではありません。

フォントの.ttf / .otfバージョンを.woff、.eot、.svgに変換し、すべての主要なブラウザーをターゲットにしました。私が使用した@ font-face構文は、基本的にFont Springの防弾構文です。

@font-face {
    font-family: 'MyFontFamily';
    src: url('myfont-webfont.eot');
    src: url('myfont-webfont.eot?#iehack') format('eot'), 
         url('myfont-webfont.woff') format('woff'), 
         url('myfont-webfont.ttf')  format('truetype'),
         url('myfont-webfont.svg#svgFontName') format('svg');
    }

HTTPヘッダーを変更し(Access-Control-Allow-Origin = "*"を追加)、クロスドメイン参照を許可しました。FFとChromeでは完全に機能しますが、IE9では次のようになります。

CSS3111: @font-face encountered unknown error.  
myfont-webfont.woff
CSS3114: @font-face failed OpenType embedding permission check. Permission must be Installable. 
myfont-webfont.ttf

フォントを.ttf / .otfから.woffに変換するときに、.afmファイルも取得されることに気付きましたが、それが重要かどうかはわかりません...

それを解決する方法はありますか?

[編集] -IIS 7.5で Webサイト(フォントも、静的コンテンツ用の別のディレクトリとサブドメインの下)をホストしています


16
すべての宿題が完了した、細かくてインテリジェントな、よく書かれた質問の+1。私たちは最近これらを非常にまれに入手します!
ペッカ

確かに、それは適切な質問ですが、悲しいことに、重複しています。
ジョセフアール

1
いいえ。Adobe以外のフォントでは、私が見つけたソリューションは完全に機能するので、それは確かに複製ではありません。異なるのは、クロスドメインフォント参照ではそうではないことです。他の言及されている「@ font-face failed cross-origin request」とは対照的に、.woffフォントでは「@ font-face遭遇した不明なエラー」が発生します。ケース。
Piotr Szmyd

埋め込みオプションを変更した後、この行で問題が発生しました。これをurl('myfont-webfont.eot?#iehack') format('eot'), 削除すると、最後のエラー(不明なエラー)が解決されました。
Jonathan DeMarks 2013年

回答:


95

「CSS3114」エラーの修正方法についてのみ説明します。
TTFファイルの埋め込みレベルを変更する必要があります。

適切なツールを使用して、インストール可能な埋め込みを許可するように設定できます。
64ビットバージョンについては、@ user22600の回答を確認してください。


11
ttfpatchのメモとして、fsType = 0を使用してください。
コリン価格

11
ttfpatchが機能しませんでした。エラー:tableversionは0、1または及び六角である必要があります:003
ドン・ローリング

11
埋め込みは正常に動作します。ソースをダウンロードしてコンパイルするだけです...これはStackOverflowですよね?ファイルは1つだけです。:-) VS2010のためにあなたが追加する必要があります#include <string.h>
ジョナサンマーク解除

3
@JonathanDeMarks:励ましをありがとう-ttfpatchも私にとってはうまくいきませんでしたが、64ビット用にembed.cを再コンパイルすると間違いなくうまくいきました。
Peter Majeed 2014年

4
WindowsでCプログラムをコンパイルすることに慣れていない人にとっては、それは非常に簡単です。このマイクロソフトのガイドに従ってください:msdn.microsoft.com/en-us/library/bb384838.aspx
lee_mcmullen

36

Knuが言ったように、このツールは使用できますが、MS-DOS用にのみコンパイルされています。Win64用にコンパイルしました。ダウンロード

使用法:

  1. 変更する必要があるフォントと同じフォルダに.exeを配置します

  2. コマンドラインでそのディレクトリに移動します

  3. type embed fontname.fonttype、fontnameをファイル名に、fonttypeを拡張子ieに置き換えますembed brokenFont.ttf

  4. すべて完了!これでフォントが機能するはずです。


ご報告ありがとうございます。修繕。
user22600

本当にたくさん助けてくれます。Win64ビットexeを使用する。
imdadhusen 2016年

私の神は素晴らしいです。すべてではない:Windowsコマンドラインを使用し、GIT BASHのような置換ではない、私は通常bashを好むが、ここでは機能しない。
ホルター2017

出来上がり!鮮やかさ!!
オールドボーイ2017

33

ieフォントのフォーマットを「eot」ではなく「embedded-opentype」に設定する必要があります。例えば:

src: url('fontname.eot?#iefix') format('embedded-opentype')

ありがとう、でもそうではありませんでした。それはすべて、フォント自体に権限を埋め込むことに関するものでした。
Piotr Szmyd 2012年

これはFirefoxとChromeで動作しました(IEはとにかく動作していました)。ありがとうございました!
Dmitri Mogilevski、2015

12

次のエラーが発生しました:

CSS3114:@ font-faceはOpenType埋め込み許可チェックに失敗しました。権限はインストール可能でなければなりません。
fontname.ttf

以下のコードを使用した後、私の問題は解決しました...

src: url('fontname.ttf') format('embedded-opentype')

助けてくれてありがとう!
乾杯、
レンジス。


私はあなたの解決策がいくつかのフォントファミリーで機能すると思いますが、他のものでは機能しないと思います。フォントの埋め込み許可レベルによって異なります。たとえば、これはAbadiフォントでは機能しません
Philip007 2013

うん、これは私の.ttfファイルとまったく違いがありませんでした。それでも、「アクセス許可はインストール可能でなければなりません」というメッセージが表示されていました。エラー。この問題を修正したのは、クリスチャンの.exe(このページの他の場所)を実行して.ttfファイルを変更することでした。これを実行した後、IE11 .ttfフォントを私のWebページに正しく表示します。
マイクグレッドヒル2016

9

これを試して、web.configに次の行を追加してください。

<system.webServer>
  <staticContent>
     <mimeMap fileExtension=".woff" mimeType="application/octet-stream" />
  </staticContent>
</system.webServer>

彼が報告したのと同じエラーだとは思いませんが、IISから.woffsを提供している場合は必要になります。または、HKLM \ Software \ Classesの下に.woffのレジストリキーを追加し、その中に「コンテンツタイプ」の値を設定することもできます。しかし、ウィキペディアは正しいタイプはだapplication/font-woffと言っています
2013年

確かに、それは別のものです。私はこのエントリを持っていました- 埋め込まれた権限のためにIEで開けないダウンロード済みのフォントに問題がありました。
Piotr Szmyd 2013年

私はApache環境で開発を行っていました。フォントファイルをWindows IISサーバーに移動すると、問題が解決しました。
Samuel Cook、

8

別の答え:法的な問題。

これを行う前に注意すべき点がいくつかあります。まず、このエラーを取得するには、IEで要素を検査し、タブを切り替えてエラーを探します。コンソールに「CSS3114」が表示されていると思います。

あなたが理解する必要があるのは、これはライセンスの問題です。IE(しゃれつもり)このエラーの原因となるフォントを読み込もうとしている場合、そのフォントを使用するためのファイルに対する権限がありません。また、権限がない場合は、ライセンスを保持していない限り、この方法でこのフォントを使用することをめぐる法的争い(それ自体は非常にまれです)。それで、あなたは初めて、あなたが「いいえ」と言う唯一のブラウザであるIEに感謝することができます。

そうは言っても、ここにあなたの答えがあります:

まず、.cssで最適なコードを使用していることを確認します。そのための他のcssの回答をいくつか参照してください。
IE 11 cssの例(すべての最新ブラウザーで動作するため、IE9を調整する必要がある場合があります):

@font-face {
font-family: "QuestionableLegalFont";
font-weight: bold;
src: url('../fonts/QuestionableLegalFont.ttf') format('truetype');
}

次に、Webフォントが機能していることを確認します(他のブラウザーでフォントを確認することで、おそらくこれをすでに知っています)。オンラインフォントコンバーターが必要な場合は、こちらを確認してください。 https //onlinefontconverter.com/をください。

最後に、「CSS3114」エラーを取り除くために。オンラインツールについては、こちらをクリックしてください:https : //www.andrebacklund.com/fontfixer.html


オンラインツールで修正されました。ありがとう!
James Hibbard、2017年

7

IE9では、埋め込みビットをInstallableに設定するためにTTFフォントが必要であることは事実です。Generatorはこれを自動的に行いますが、現在、他の理由でAdobeフォントをブロックしています。この制限は近いうちに解除される可能性があります。


7

この問題のために私は多くの時間を無駄にしました。最後に私は自分で素晴らしい解決策を見つけました。以前は.ttfフォントのみを使用していました。しかし、IEで機能するようになったフォントフォーマット.eotを1つ追加しました。

私は次のコードを使用しましたが、すべてのブラウザで魅力的に機能しました。

@font-face {
font-family: OpenSans;
src: url(assets/fonts/OpenSans/OpenSans-Regular.ttf), 
url(assets/fonts/OpenSans/OpenSans-Regular.eot);
}

@font-face {
font-family: OpenSans Bold;
src: url(assets/fonts/OpenSans/OpenSans-Bold.ttf),
url(assets/fonts/OpenSans/OpenSans-Bold.eot);
}

これが誰かの役に立つことを願っています。


4

Macユーザーとして、フォントの埋め込み権限を修正するために言及されたMS-DOSおよびWindowsコマンドラインツールを使用できませんでした。ただし、FontLabを使用してこれを修正し、権限を「すべて許可」に設定できることがわかりました。Mac OS Xでフォントアクセス許可をインストール可能に設定する方法に関するこのレシピが他のユーザーにも役立つことを願っています。


「MS-DOSとWindowsのコマンドラインツールを使用できませんでした」:ソースコードは提供されていますが、Macでコンパイルするだけだと思いますか?
2014年

申し訳ありませんが、次のように言っています。甘やかされて育ったOS X Finderユーザーです。
buijs

4

nodejs / npmに慣れている場合、ttembed-jsはTTFフォントに「インストール可能な埋め込みを許可」フラグを設定する簡単な方法です。これにより、指定した.ttfファイルが変更されます。

npm install -g ttembed-js

ttembed-js somefont.ttf

ありがとう-これは、IE11で問題を引き起こしていた.otfフォントに最適です。
Jスプレーグ

3

問題は、サーバー構成に関係している可能性があります-フォントファイルの正しいヘッダーを送信していない可能性があります。IE9がクロスオリジンWebフォントのダウンロードをブロックする質問に対する回答をご覧ください。

EricLawは、Apache設定に以下を追加することを提案しています

<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "http://mydomain.com"
    </IfModule>
</FilesMatch>

しかし、これは同じケースではありません。私はその投稿を読み、あなたが提供した解決策をすでに試しました。問題は特にAdobeフォントにあります。Font Squirrelのフォントキットを使用してみましたが、それらはすべてのブラウザー(IE9でも同様)で問題なく機能します。同じ方法でAdobeフォント(適切な形式に変換された)を使用しようとすると、IE9がエラーで叫ぶ...
Piotr Szmyd

そして、私が言うのを忘れた(質問を編集します)-IIS 7.5でWebサイトを実行しています。
Piotr Szmyd

彼らは万が一フォントをタイプしていますか?
ジョセフアール

これらはすべて単一ファイルの.ttf(TrueType)フォントです。しかし、どういうわけか、onlinefontconverter.comを介して.woff形式に変換するときに.afm(Adobe Font Metrics)ファイルを取得します。どうすればいいのかわかりません。
Piotr Szmyd

2

ttfpatchを使用するときに「tableversionは0、1、またはhex:003である必要があります」というエラーが発生するすべての人のために、64ビット用の埋め込みをコンパイルしました。私は何も変更していませんが、必要なライブラリを追加してコンパイルしました。自己責任で使用してください。

使用法:ConsoleApplication1 font.ttf

http://www.mediafire.com/download/8x1px8aqq18lcx8/ConsoleApplication1.exe


2

Cコードを実行する代わりにPHPスクリプトを使用してこれを実行する場合(または、私のようなMacを使用していて、Xcodeでコンパイルして、1年間開くのを待つことはできない場合)は、次のとおりです。フォントから埋め込み権限を削除するために使用できるPHP関数:

function convertRestrictedFont($filename) {
    $font = fopen($filename,'r+');
    if ($font === false) {
        throw new Exception('Could not open font file.');
    }

    fseek($font, 12, 0);

    while (!feof($font)) {
        $type = '';
        for ($i = 0; $i < 4; $i++) {
            $type .= fgetc($font);
            if (feof($font)) {
                fclose($font);
                throw new Exception('Could not read the table definitions of the font.');
            }
        }
        if ($type == 'OS/2') {
            // Save the location of the table definition
            // containing the checksum and pointer to the data
            $os2TableDefinition = ftell($font);
            $checksum = 0;

            for ($i = 0; $i < 4; $i++) {
                fgetc($font);
                if (feof($font)) {
                    fclose($font);
                    throw new Exception('Could not read the OS/2 table header of the font.');
                }
            }

            // Get the pointer to the OS/2 table data
            $os2TablePointer = ord(fgetc($font)) << 24;
            $os2TablePointer |= ord(fgetc($font)) << 16;
            $os2TablePointer |= ord(fgetc($font)) << 8;
            $os2TablePointer |= ord(fgetc($font));

            $length = ord(fgetc($font)) << 24;
            $length |= ord(fgetc($font)) << 16;
            $length |= ord(fgetc($font)) << 8;
            $length |= ord(fgetc($font));

            if (fseek($font, $os2TablePointer + 8, 0) !== 0) {
                fclose($font);
                throw new Exception('Could not read the embeddable type of the font.');
            }

            // Read the fsType before overriding it
            $fsType = ord(fgetc($font)) << 8;
            $fsType |= ord(fgetc($font));

            error_log('Installable Embedding: ' . ($fsType == 0));
            error_log('Reserved: ' . ($fsType & 1));
            error_log('Restricted License: ' . ($fsType & 2));
            error_log('Preview & Print: ' . ($fsType & 4));
            error_log('Editable Embedding: ' . ($fsType & 8));
            error_log('Reserved: ' . ($fsType & 16)); 
            error_log('Reserved: ' . ($fsType & 32));
            error_log('Reserved: ' . ($fsType & 64));
            error_log('Reserved: ' . ($fsType & 128));
            error_log('No subsetting: ' . ($fsType & 256));
            error_log('Bitmap embedding only: ' . ($fsType & 512));                         
            error_log('Reserved: ' . ($fsType & 1024));
            error_log('Reserved: ' . ($fsType & 2048));
            error_log('Reserved: ' . ($fsType & 4096));
            error_log('Reserved: ' . ($fsType & 8192));
            error_log('Reserved: ' . ($fsType & 16384));
            error_log('Reserved: ' . ($fsType & 32768));

            fseek($font, ftell($font) - 2);

            // Set the two bytes of fsType to 0
            fputs($font, chr(0), 1);
            fputs($font, chr(0), 1);

            // Go to the beginning of the OS/2 table data
            fseek($font, $os2TablePointer, 0);

            // Generate a new checksum based on the changed 
            for ($i = 0; $i < $length; $i++) {
                $checksum += ord(fgetc($font));
            }
            fseek($font, $os2TableDefinition, 0);
            fputs($font, chr($checksum >> 24), 1);
            fputs($font, chr(255 & ($checksum >> 16)), 1);
            fputs($font, chr(255 & ($checksum >> 8)), 1);
            fputs($font, chr(255 & $checksum), 1);

            fclose($font);

            return true;
        }
        for ($i = 0; $i < 12; $i++) {
            fgetc($font);
            if (feof($font)) {
                fclose($font);
                throw new Exception('Could not skip a table definition of the font.');
            }
        }
    }

    fclose($font);

    return false;
}

このコードを実行する前に必ずフォントファイルをバックアップしてください。フォントファイルが破損しても、私を責めないでください。

Cの元のソースはここにあります


これは機能し、今や一番の答えになるはずです。古い答えを追い抜くためにこれまでに登るのは残念です。
2016

@Gooseに感謝します!私はもともと自分の仕事のためにこれを書きましたが、コードは捨てられて置き換えられたので、Stack Overflowでそのまま使用できます。Webアプリケーションの問題にCコードを提供することは、明らかに理想的ではありません。
NobleUplift 2016

@Goose Cコードを取得します。常に。だからそれは好みの問題であり、これがこの答えが答えと同等である理由です。参考までに、CGIを使用してWebサイトにCコードを実装することもできます。
71GA

0

あなたは次のコードでそれを解決することができます

@font-face {
  font-family: 'Font-Name';
  src: url('../fonts/Font-Name.ttf');
  src: url('../fonts/Font-Name.eot?#iefix') format('embedded-opentype');
}

いいえ、機能しません。私のケースは、設計による埋め込み許可しないフォントについて厳密に(ただし、それを許可するライセンスが必要です)。だから私がそれを埋め込む方法についてではありません。Web埋め込みを明示的に禁止しているTTFフォントで確認すると、私の問題が理解できます。
Piotr Szmyd 2015

0

eotファイルを超えて置く必要があることがわかりましたttf。の下ttfにある場合、フォントが正しく表示されると考えられても、IE9はエラーをスローします。

推奨:

@font-face {
  font-family: 'Font-Name';
  src: url('../fonts/Font-Name.eot?#iefix') format('embedded-opentype');
  src: url('../fonts/Font-Name.ttf')  format('truetype');
}

推奨:

@font-face {
  font-family: 'Font-Name';
  src: url('../fonts/Font-Name.ttf')  format('truetype');
  src: url('../fonts/Font-Name.eot?#iefix') format('embedded-opentype');
  }


0

最近、ロード時にコンソールでCSS3114およびCSS3111エラーを生成する.eotおよび.otfフォントでこの問題が発生しました。私にとってうまくいった解決策は、.ttf形式のフォールバックで.woffおよび.woff2形式のみを使用することでした。.woff形式は、ほとんどのブラウザで.ttfの前に使用され、フォントの埋め込み権限の問題(css3114)やフォントの名前の形式の誤り(css3111)を引き起こさないようです。私は私の解決策を見つけましたCSS3111およびCSS3114の問題に関するこの非常に役立つ記事と@ font-faceの使用に関するこの記事を読んで、。

注:このソリューションでは、フォントファイルを再コンパイル、変換、編集する必要はありません。これはCSSのみのソリューションです。私がテストしたフォントには、.eot、.otf、.woff、.woff2、および.svgバージョンが含まれていました。おそらく、試したときに3114エラーを生成した元の.ttfソースからのものですが、.woffと。 woff2ファイルはこの問題の影響を受けないようです。

これは、@ font-faceを使用してDIDで機能したものです。

@font-face {
  font-family: "Your Font Name";
  font-weight: normal;
  src: url('your-font-name.woff2') format('woff2'),
       url('your-font-name.woff') format('woff'),
       url('your-font-name.ttf')  format('truetype');
}

これが、IEの@ font-faceでエラーを引き起こした原因です。

@font-face {
  font-family: 'Your Font Name';
  src: url('your-font-name.eot');
  src: url('your-font-name.eot?#iefix') format('embedded-opentype'),
       url('your-font-name.woff2') format('woff2'),
       url('your-font-name.woff') format('woff'),
       url('your-font-name.ttf')  format('truetype'),
       url('your-font-name.svg#svgFontName') format('svg');
}

0

これは私にとってはうまくいきます:

@font-face {
  font-family: FontName;
  src: url('@{path-fonts}/FontName.eot?akitpd');
  src: url('@{path-fonts}/FontName.eot?akitpd#iefix') format('embedded-opentype'),
    url('@{path-fonts}/FontName.ttf?akitpd') format('truetype'),
    url('@{path-fonts}/FontName.woff?akitpd') format('woff'),
    url('@{path-fonts}/FontName.svg?akitpd#salvage') format('svg');
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.