Make Adobe fonts work with CSS3 @ font-face in IE9

Jestem w trakcie budowania małej aplikacji intranetowej i bez powodzenia próbuję użyć Adobe font , którą ostatnio kupiłem. Jak zostałem poinformowany, w naszym przypadku nie jest to naruszenie licencji.

Nawróciłem .ttf/wersje otf czcionki do .woff,eot i .svg, tak aby kierować wszystkie główne przeglądarki. składnia @font-face, której użyłem, jest w zasadzie kuloodporna z 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');
    }

Zmodyfikowałem nagłówki HTTP (dodano Access-Control-Allow-Origin = "*"), aby umożliwić odniesienia między domenami. W FF i Chrome działa idealnie, ale w IE9 dostaję:

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

Zauważyłem, że przy konwersji czcionki z .ttf/otf do .woff dostaję też .plik afm , ale nie mam pojęcia czy to ważne czy nie...

Jakieś pomysły, jak to rozwiązać?

[edytuj] - hostuję swoje strony (czcionki też, ale pod osobnym katalogiem i subdomeną dla treści statycznych) pod IIS 7.5

Author: Piotr Szmyd, 2011-04-08

18 answers

Mogę tylko wyjaśnić, jak naprawić błąd "CSS3114".
Musisz zmienić poziom osadzania pliku TTF.

Używając odpowiedniego narzędzia możesz ustawić go na dozwolone osadzanie instalacji.
W przypadku wersji 64-bitowej sprawdź @user22600 ' s answer.

 93
Author: Knu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:27

Jak powiedział Knu, możesz użyć tego narzędzia , Jednak jest ono skompilowane tylko dla MS-DOS. Skompilowałem go dla Win64. Pobierz .

Użycie:

  1. Miejsce .exe w tym samym folderze co czcionka musisz zmodyfikować

  2. Przejdź do tego katalogu w wierszu poleceń

  3. Type embed fontname.fonttype, zastępując fontname nazwą pliku, a fonttype rozszerzeniem tzn. embed brokenFont.ttf

  4. Gotowe! Twoja czcionka powinna teraz praca.

 34
Author: user22600,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 17:18:44

Powinieneś ustawić format czcionki ie na 'embedded-opentype', a nie 'eot'. Na przykład:

src: url('fontname.eot?#iefix') format('embedded-opentype')
 33
Author: stefannh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 08:27:21

Otrzymałem następujący błąd:

CSS3114: @ font-face nie powiodło się sprawdzanie uprawnień osadzania OpenType. Pozwolenie musi być instalowalne.
fontname.ttf

Po użyciu poniższego kodu mój problem został rozwiązany....

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

Dziękuję wam za pomoc!
Pozdrawiam,
Renjith.

 12
Author: Renjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 08:34:02

Spróbuj tego, dodaj tę linię w sieci.config.

<system.webServer>
  <staticContent>
     <mimeMap fileExtension=".woff" mimeType="application/octet-stream" />
  </staticContent>
</system.webServer>
 9
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 23:14:17

Inna odpowiedź: kwestie prawne.

Jest kilka rzeczy do zapamiętania zanim to zrobisz. Po pierwsze, aby uzyskać ten błąd, w IE, sprawdź element, Przełącz karty i Szukaj błędów, wierzę ,że" CSS3114 " pojawia się w konsoli. Musisz zrozumieć, że to kwestia licencjonowania. Jeśli próbujesz załadować czcionkę, która powoduje ten błąd, nie masz uprawnień do używania czcionki w pliku, a jeśli nie masz uprawnień, jest to wysoce prawdopodobnie możesz przegrać walkę prawną (która sama w sobie jest bardzo mało prawdopodobna) o używanie tej czcionki w ten sposób, chyba że posiadasz licencję. Możesz więc po raz pierwszy podziękować IE za to, że jest jedyną przeglądarką, która mówi ci "nie", ponieważ przynajmniej pozwala Ci wiedzieć, że robisz coś wątpliwego.

Oto Twoja odpowiedź:

Najpierw upewnij się, że używasz najlepszego kodu w .css, zobacz inne odpowiedzi css na to.
Przykład IE 11 css (działa w wszystkie nowoczesne przeglądarki mogą wymagać poprawienia dla IE9):

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

Następnie upewnij się, że masz działającą czcionkę internetową(prawdopodobnie już to wiesz, widząc czcionkę w innych przeglądarkach). Jeśli potrzebujesz konwertera czcionek online, sprawdź tutaj: https://onlinefontconverter.com/

Wreszcie, aby pozbyć się błędu "CSS3114". Aby uzyskać narzędzie online, Kliknij tutaj: https://www.andrebacklund.com/fontfixer.html

 8
Author: Patrick Knott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 19:21:59

Prawdą jest, że IE9 wymaga czcionek TTF, aby bity osadzania były ustawione na instalowalne. Generator robi to automatycznie, ale obecnie blokujemy czcionki Adobe z innych powodów. Możemy znieść to ograniczenie w najbliższej przyszłości.

 7
Author: Font Squirrel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-14 00:45:31

Zmarnowałem dużo czasu z powodu tego problemu. W końcu sam znalazłem świetne rozwiązanie. Zanim brałem .tylko czcionka ttf. Ale dodałem jeden dodatkowy format czcionki .eot, który zaczął działać w IE.

Użyłem poniższego kodu i działał jak charm we wszystkich przeglądarkach.

@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);
}
Mam nadzieję, że to komuś pomoże.
 7
Author: Stack Developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 11:15:57

Jako użytkownik Mac, nie byłem w stanie korzystać z narzędzi linii poleceń MS-DOS i Windows, o których wspomniano, aby naprawić uprawnienia do osadzania czcionek. Jednak dowiedziałem się, że możesz to naprawić za pomocą FontLab, aby ustawić pozwolenie na "wszystko jest dozwolone". Mam nadzieję, że ten przepis jak ustawić uprawnienia czcionki do instalacji na Mac OS X jest przydatny również dla innych.

 4
Author: buijs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-16 01:06:10

Jeśli znasz nodejs/npm, ttembed-js jest łatwym sposobem na ustawienie flagi "installable embedding allowed" na czcionce TTF. Spowoduje to modyfikację podanego .plik ttf:

npm install -g ttembed-js

ttembed-js somefont.ttf
 4
Author: bendytree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 12:36:04

Problem może być związany z konfiguracją serwera-może to nie być wysyłanie właściwych nagłówków dla plików czcionek. Zapoznaj się z odpowiedzią na pytanie IE9 blokuje pobieranie cross-origin Web font.

EricLaw sugeruje dodanie następujących elementów do konfiguracji Apache

<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "http://mydomain.com"
    </IfModule>
</FilesMatch>
 3
Author: Joseph Earl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:47

Dla każdego, kto dostaje błąd: "tableversion musi być 0, 1 lub i jest hex: 003" podczas korzystania z ttfpatch, skompilowałem embed dla 64bit. Nic nie zmieniłem, tylko dodałem potrzebne libs i skompilowałem. Stosować na własne ryzyko.

Użycie: czcionka ConsoleApplication1.ttf

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

 2
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 08:39:48

Jeśli chcesz to zrobić ze skryptem PHP zamiast uruchamiać kod C (lub jesteś na komputerze Mac takim jak ja i nie możesz kompilować z Xcode tylko czekać rok na jego otwarcie), oto funkcja PHP, której możesz użyć do usunięcia uprawnień do osadzania z czcionki:

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;
}

Upewnij się, że wykonałeś kopię zapasową pliku czcionki przed uruchomieniem tego kodu i nie obwiniaj mnie, jeśli jest uszkodzony.

oryginalne źródło w C można znaleźć tutaj .

 2
Author: NobleUplift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 20:39:40

Możesz go rozwiązać za pomocą kodu

@font-face {
  font-family: 'Font-Name';
  src: url('../fonts/Font-Name.ttf');
  src: url('../fonts/Font-Name.eot?#iefix') format('embedded-opentype');
}
 0
Author: w.a.siddiqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 17:06:54

Znalazłem eot Plik powinien być umieszczony poza ttf. Jeśli jest pod ttf, jeśli czcionka wyświetla się poprawnie, IE9 nadal wyrzuci błąd.

Polecam:

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

Nie Polecam:

@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
Author: shisaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 02:07:51

Próbowałem narzędzia ttfpatch i nie zadziałało. Internet Exploder 9 i 10 nadal narzekał.

Znalazłem ten fajny Git gist i rozwiązał moje problemy. https://gist.github.com/stefanmaric/a5043c0998d9fc35483d

Wystarczy skopiować i wkleić kod do css.

 0
Author: Mark O'Russa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 08:11:10

Ostatnio napotkałem ten problem z .eot i .czcionki otf powodujące błędy CSS3114 i CSS3111 w konsoli podczas ładowania. Rozwiązanie, które działało dla mnie, było tylko do użycia .woff i .formaty woff2 z ... TTF format fallback. The .formaty woff będą używane wcześniej .ttf w większości przeglądarek i wydaje się, że nie powoduje problemu z uprawnieniami do osadzania czcionek (css3114) i problemu z nieprawidłowym nazewnictwem czcionek (css3111). Znalazłem swoje rozwiązanie w tym niezwykle pomocnym artykule o CSS3111 i css3114 wydają, a także czytają Ten artykuł o używaniu @font-face .

Uwaga: To rozwiązanie nie wymaga ponownej kompilacji, konwersji ani edycji żadnych plików czcionek. Jest to rozwiązanie tylko dla css. Czcionka, którą testowałem, miała .eot,otf,woff,woff2 i .wersje svg wygenerowane dla niego, prawdopodobnie z oryginału .źródło ttf, które wytworzyło błąd 3114, gdy próbowałem go jednak .woff i .pliki woff2 wydawały się być odporne na ten problem.

This Is what Czy praca dla mnie z @ font-face:

@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');
}

To spowodowało błędy z @ font-face W IE:

@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
Author: bwigs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 20:19:37

To działa dla mnie:

@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');
}
 0
Author: Alena Kastsiukavets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 12:23:39