Fai in modo che i caratteri Adobe funzionino con CSS3 @ font-face in IE9


132

Sto costruendo una piccola applicazione Intranet e provo, senza fortuna, a utilizzare il carattere Adobe acquistato di recente. Come mi è stato comunicato, nel nostro caso non si tratta di una violazione della licenza.

Ho convertito le versioni .ttf / .otf del font in .woff, .eot e .svg, in modo da scegliere come target tutti i principali browser. La sintassi @ font-face che ho usato è sostanzialmente quella antiproiettile di 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');
    }

Ho modificato le intestazioni HTTP (aggiunto Access-Control-Allow-Origin = "*") per consentire riferimenti tra domini. In FF e Chrome funziona perfettamente, ma in IE9 ottengo:

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

Ho notato che quando converto il font da .ttf / .otf a .woff ottengo anche un file .afm , ma non ho idea che sia importante o meno ...

Qualche idea su come risolverlo?

[Modifica] - Ospito i miei siti Web (anche caratteri, ma in directory e sottodomini separati per contenuto statico) in IIS 7.5


16
+1 per una domanda eccellente, intelligente e ben formulata con tutti i compiti fatti. Li riceviamo troppo raramente in questi giorni!
Pekka,

In effetti è una domanda ben formulata, ma purtroppo un duplicato.
Joseph Earl,

1
No, sicuramente non è un duplicato, poiché nei caratteri non Adobe le soluzioni che ho trovato funzionano perfettamente. Ciò che differisce è che non è il caso della referenziazione dei caratteri tra domini suppongo - ottengo "@ font-face errore sconosciuto" con il font .woff al contrario di "@ font-face non riuscita richiesta tra origini" in altre citate casi.
Piotr Szmyd,

Ho avuto problemi con questa riga dopo aver modificato le opzioni di incorporamento: url('myfont-webfont.eot?#iehack') format('eot'), La sua rimozione ha risolto l'ultimo errore (errore sconosciuto).
Jonathan DeMarks,

Risposte:


95

Posso solo spiegarti come correggere l'errore "CSS3114".
Devi modificare il livello di incorporamento del tuo file TTF.

Utilizzando lo strumento appropriato è possibile impostarlo sull'incorporamento installabile consentito .
Per una versione a 64 bit, controlla la risposta di @ user22600 .


11
Come nota per ttfpatch, usa fsType = 0.
Collin Price,

11
ttfpatch non ha funzionato per me. Errore: tableversion deve essere 0, 1 o ed è esadecimale: 003
Don Rolling

11
embed funziona bene. Basta scaricare il sorgente e compilare ... questo è StackOverflow, giusto? È solo un file. :-) Per VS2010 devi aggiungere:#include <string.h>
Jonathan DeMarks il

3
@JonathanDeMarks: Grazie per l'incoraggiamento - ttfpatch non ha funzionato neanche per me, ma la ricompilazione di embed.c per 64 bit ha sicuramente funzionato.
Peter Majeed,

4
Per coloro che non sono alla pari con la compilazione di programmi C su Windows, è molto semplice. Segui questa guida da Microsoft: msdn.microsoft.com/en-us/library/bb384838.aspx
lee_mcmullen

36

Come ha detto Knu, puoi usare questo strumento , tuttavia è compilato solo per MS-DOS. L'ho compilato per Win64. Scarica .

Uso:

  1. Posizionare .exe nella stessa cartella del carattere che è necessario modificare

  2. Passare a quella directory nella riga di comando

  3. digitare embed fontname.fonttype, sostituendo fontname con il nome file e fonttype con l'estensione ieembed brokenFont.ttf

  4. Tutto fatto! Il font dovrebbe ora funzionare.


Grazie per la segnalazione. Fisso.
user22600

Mi aiuti davvero molto. usando Win64 bit exe.
imdadhusen,

Mio Dio è fantastico. Non è tutto: usa la riga di comando di Windows e non un sostituto come GIT BASH, di solito preferisco bash, non funziona qui.
Halter,

Ecco! brillante!!
oldboy

33

Dovresti impostare il formato del font ie su "embedded-opentype" e non su "eot". Per esempio:

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

Grazie, ma non era così. Si trattava di incorporare le autorizzazioni nel font stesso.
Piotr Szmyd,

Questo ha funzionato per Firefox e Chrome (IE funzionava comunque). Grazie!
Dmitri Mogilevski,

12

Stavo ottenendo il seguente errore:

CSS3114: @ font-face non è riuscito il controllo delle autorizzazioni per l'incorporamento di OpenType. L'autorizzazione deve essere installabile.
fontname.ttf

Dopo aver utilizzato il codice seguente il mio problema è stato risolto ....

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

Grazie ragazzi per avermi aiutato!
Saluti,
Renjith.


Penso che la tua soluzione funzioni per alcune famiglie di caratteri ma non per altre. Dipende dal livello di autorizzazione per l'incorporamento del font. Ad esempio, questo non funzionerà per il font Abadi
Philip007,

Sì, questo non ha fatto alcuna differenza con i miei file .ttf, stavo ancora ottenendo il "permesso deve essere installabile". errore. Ciò che ha risolto questo problema era l'esecuzione di .exe di Christian (altrove in questa pagina) per modificare i file .ttf. Dopo aver fatto ciò, IE11 avrebbe visualizzato correttamente i caratteri .ttf sulla mia pagina web.
Mike Gledhill,

9

Prova questo, aggiungi queste righe nel web.config.

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

Non penso che sia lo stesso errore che ha segnalato, ma che sarà richiesto se stai servendo .woff da IIS, sì. In alternativa, è possibile aggiungere una chiave di registro per .woff in HKLM \ Software \ Classes e impostare il valore "Tipo di contenuto". Tuttavia Wikipedia afferma che il tipo corretto èapplication/font-woff .
Rup,

Anzi, è una cosa diversa. Ho avuto questa voce - il problema era con un font già scaricato che non poteva essere aperto in IE a causa delle autorizzazioni incorporate.
Piotr Szmyd,

Stavo facendo lo sviluppo in un ambiente Apache e quando ho spostato i miei file di font su un server IIS di Windows, questo ha risolto il mio problema.
Samuel Cook,

8

Una risposta diversa: problemi legali.

Ci sono un paio di cose da notare prima di farlo. Innanzitutto, per ottenere questo errore, in IE, ispeziona l'elemento, cambia scheda e cerca gli errori, credo che "CSS3114" venga visualizzato nella console.

Quello che devi capire è che questo è un problema di licenza. IE (gioco di parole previsto) se si sta tentando di caricare un carattere che causa questo errore, non si dispone delle autorizzazioni sul file per utilizzare il carattere e, se non si dispone dell'autorizzazione, è molto probabile che si possa perdere un battaglia legale (che è altamente improbabile) sull'uso di questo carattere in questo modo a meno che tu non sia in possesso della licenza. Quindi, per la prima volta, puoi ringraziare IE per essere l'unico browser a dirti "no", perché almeno ti fa sapere che stai facendo qualcosa di discutibile.

Detto questo, ecco la tua risposta:

Per prima cosa assicurati di utilizzare il miglior codice in .css, vedi alcune delle altre risposte css per questo.
Esempio di IE 11 css (funziona su tutti i browser moderni potrebbe essere necessario modificare per IE9):

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

Quindi, assicurati di avere un font web funzionante (probabilmente lo sai già vedendo il tuo font in altri browser). Se hai bisogno di un convertitore di font online, controlla qui: https://onlinefontconverter.com/

Infine, per eliminare l'errore "CSS3114". Per uno strumento online, fai clic qui: https://www.andrebacklund.com/fontfixer.html


Lo strumento online ha risolto il problema per me. Grazie!
James Hibbard,

7

È vero che IE9 richiede che i caratteri TTF abbiano i bit di incorporamento impostati su Installabile. Il generatore lo fa automaticamente, ma attualmente stiamo bloccando i caratteri Adobe per altri motivi. Potremmo revocare questa limitazione nel prossimo futuro.


7

Ho perso molto tempo a causa di questo problema. Finalmente ho trovato un'ottima soluzione me stesso. Prima stavo usando solo il font .ttf. Ma ho aggiunto un altro formato di carattere .eot che ha iniziato a funzionare in IE.

Ho usato il seguente codice e ha funzionato come un incantesimo in tutti i browser.

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

Spero che questo possa aiutare qualcuno.


4

Come utente Mac, non sono stato in grado di utilizzare gli strumenti da riga di comando MS-DOS e Windows menzionati per correggere l'autorizzazione all'incorporamento dei caratteri. Tuttavia, ho scoperto che è possibile risolvere questo problema usando FontLab per impostare l'autorizzazione su "Tutto è permesso". Spero che questa ricetta su come impostare l'autorizzazione del carattere su Installabile su Mac OS X sia utile anche per gli altri.


"Non sono stato in grado di utilizzare gli strumenti da riga di comando di MS-DOS e Windows": Il codice sorgente è fornito, ma mi aspetto che si compili su Mac?
Rup,

Siamo spiacenti, intendevo dire: essere un utente viziato di OS X Finder.
Buijs

4

Se hai familiarità con nodejs / npm, ttembed-js è un modo semplice per impostare il flag "incorporamento consentito consentito" su un font TTF. Ciò modificherà il file .ttf specificato:

npm install -g ttembed-js

ttembed-js somefont.ttf

Grazie - ha funzionato benissimo per i caratteri .otf che mi stavano causando problemi in IE11.
J Sprague,

3

Il problema potrebbe riguardare la configurazione del tuo server: potrebbe non essere l'invio delle intestazioni giuste per i file dei caratteri. Dai un'occhiata alla risposta fornita per la domanda IE9 blocca il download di font web di origine incrociata .

EricLaw suggerisce di aggiungere quanto segue alla configurazione di Apache

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

Ma questo non è lo stesso caso però. Ho letto quel post e ho già provato la soluzione che hai fornito. Il problema è specificamente con i caratteri Adobe. Ho provato a usare i kit di caratteri da Font Squirrel e quelli funzionano perfettamente su tutti i browser (anche IE9). Quando provo ad usare i caratteri Adobe (convertiti in formati appropriati) allo stesso modo - IE9 grida con errori ...
Piotr Szmyd

E - cosa che ho dimenticato di dire (modificherò la mia domanda) - Sto gestendo i miei siti Web con IIS 7.5.
Piotr Szmyd,

Sono tipi di carattere 1 per caso?
Joseph Earl,

Questi sono tutti i caratteri .ttf (TrueType) a file singolo. Ma in qualche modo ottengo un file .afm (Adobe Font Metrics) durante la conversione in formato .woff tramite onlinefontconverter.com. Non ho idea di cosa farsene?
Piotr Szmyd,

3

Se vuoi farlo con uno script PHP invece di dover eseguire il codice C (o sei su un Mac come me e non puoi essere compilato con Xcode solo per aspettare un anno per l'apertura), ecco un Funzione PHP che è possibile utilizzare per rimuovere le autorizzazioni di incorporamento dal carattere:

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

Assicurati di eseguire il backup del file dei caratteri prima di eseguire questo codice e non incolparmi se si corrompe.

La fonte originale in C può essere trovata qui .


Funziona e ora dovrebbe essere la risposta numero 1. È un peccato che abbia finora dovuto arrampicarsi per superare le risposte più vecchie.
Oca,

Grazie mille @Goose! Inizialmente l'ho scritto per il mio lavoro, ma il codice è stato gettato via e sostituito, quindi vive in Stack Overflow. Fornire il codice C per un problema dell'applicazione Web non è sicuramente l'ideale.
NobleUplift,

@Scegli I perfer codice C. Sempre. Quindi è una questione di gusti ed è per questo che questa risposta è equivalente alla risposta. Cordiali saluti, puoi anche usare CGI per implementare il codice C nel tuo sito web.
71GA,


0

Puoi risolverlo seguendo il codice

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

No, non funzionerà. Il mio caso riguardava esclusivamente i caratteri che non consentivano l'incorporamento in base alla progettazione (ma con una licenza che lo consente). Quindi non si tratta di come l'ho incorporato. Controllalo con un carattere TTF che proibisca esplicitamente l'incorporamento del web e capirai il mio problema.
Piotr Szmyd,

0

Ho trovato che il eotfile dovrebbe essere messo oltre ttf. Se è sotto ttf, pensato che il carattere mostri correttamente, IE9 genererà ancora un errore.

Consiglia:

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

Sconsigliato :

@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

Di recente ho riscontrato questo problema con i caratteri .eot e .otf che producono gli errori CSS3114 e CSS3111 nella console durante il caricamento. La soluzione che ha funzionato per me era usare solo i formati .woff e .woff2 con un fallback di formato .ttf. I formati .woff verranno utilizzati prima di .ttf nella maggior parte dei browser e non sembrano innescare il problema delle autorizzazioni per l'incorporamento dei caratteri (css3114) e il problema del formato errato della denominazione dei caratteri (css3111). Ho trovato la mia soluzione in questo articolo estremamente utile sul problema CSS3111 e CSS3114 e leggendo anche questo articolo sull'uso di @ font-face .

nota: questa soluzione non richiede la ricompilazione, la conversione o la modifica di alcun file di font. È una soluzione solo per CSS. Il font con cui ho provato aveva .eot, .otf, .woff, .woff2 e .svg versioni generate per esso, probabilmente dalla fonte originale .ttf che ha prodotto l'errore 3114 quando l'ho provato, tuttavia .woff e. I file woff2 sembravano essere immuni a questo problema.

Questo è ciò che DID funziona per me con @ 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');
}

Questo è ciò che ha innescato gli errori con @ font-face in 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

Questo funziona per me:

@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');
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.