在IE9中使Adobe字体与CSS3 @ font-face一起工作

我正在构build一个小型Intranet应用程序,并尝试使用最近购买的Adobe字体 。 据我所知,在我们的情况下,这不是一个许可证违规。

我将.ttf / .otf版本的字体转换为.woff,.eot和.svg,以便定位所有主stream浏览器。 我使用的@ 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下托pipe我的网站(也是字体,但在静态内容的单独目录和子域下)

我只能解释你如何解决“CSS3114”错误。
您必须更改TTF文件的embedded级别。

使用适当的工具,您可以将其设置为允许安装embedded
对于64位版本,请检查@ user22600的答案 。

您应该将ie字体的格式设置为“embedded-opentype”,而不是“eot”。 例如:

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

正如Knu所说的,你可以使用这个工具 ,但是它只是为MS-DOS编译的。 我编译它为Win64。 下载 。

用法:

  1. 将.exe放在与需要修改的字体相同的文件夹中

  2. 在命令行中导航到该目录

  3. 键入embed fontname.fonttype ,用扩展名replacefontname,文件名和字体types,例如embed brokenFont.ttf

  4. 全做完了! 你的字体现在应该工作。

我得到以下错误:

CSS3114:@ font-face失败OpenTypeembedded权限检查。 权限必须是可安装的。
fontname.ttf

使用下面的代码后,我的问题得到解决….

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

谢谢你帮我!
干杯,
Renjith。

试试这个,在web.config中添加这行。

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

确实,IE9要求TTF字体将embedded位设置为Installable。 生成器会自动执行此操作,但由于其他原因,我们正在阻止Adobe字体。 我们可以在不久的将来解除这个限制。

由于这个问题,我浪费了很多时间。 最后我自己find了很好的解决 之前我只使用.ttf字体。 但是我添加了一个额外的字体格式,而不是在IE中开始工作。

我使用下面的代码,它在所有浏览器中都像魅力一样。

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

我希望这会帮助别人。

不同的答案:法律问题。

在做这件事之前,有几件事要注意。 首先,要得到这个错误,在IE中,检查元素,切换你的标签,并寻找错误,我相信“CSS3114”出现在控制台。

你需要了解的是这是一个授权问题。 IE(双关意图)如果您试图加载导致此错误的字体,您没有权限使用该字体的文件,并且如果您没有权限,很可能是您可能会丢失除非持有许可证,否则以这种方式使用这种字体的法律战争(本身不太可能)。 所以,你可以第一次感谢IE浏览器是唯一一个告诉你“不”的浏览器,因为它至less让你知道你正在做一些有问题的事情。

这就是说,这是你的答案:

首先确保你在.css中使用最好的代码,看看其他一些CSS的答案。
IE 11的CSS例子(适用于所有现代浏览器可能需要调整IE9):

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

然后,确保你有一个工作的networking字体(你可能已经知道通过在其他浏览器中看到你的字体)。 如果你需要一个在线字体转换器,请点击这里: https : //onlinefontconverter.com/

最后,要摆脱“CSS3114”错误。 对于在线工具,请点击此处: https : //www.andrebacklund.com/fontfixer.html

作为Mac用户,我无法使用提到的MS-DOS和Windows命令行工具修复字体embedded权限。 不过,我发现你可以使用FontLab来解决这个问题,把权限设置为“一切都是允许的”。 我希望这个关于如何在Mac OS X上将字体权限设置为Installable的配方对其他人也很有用。

如果您熟悉nodejs / npm,则可以使用ttembed-js来设置TTF字体上的“可安装embedded允许”标志。 这将修改指定的.ttf文件:

 npm install -g ttembed-js ttembed-js somefont.ttf 

这个问题可能与你的服务器configuration有关 – 它可能不会为字体文件发送正确的头文件。 看看IE9下载跨网页字体的问题给出的答案。

EricLawbuild议将以下内容添加到您的Apacheconfiguration中

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

对于每个得到错误的人:“tableversion必须是0,1或者是hex:003”,当使用ttfpatch时,我已经编译为64位embedded。 我没有改变任何东西,只是添加需要库和编译。 使用风险自负。

用法:ConsoleApplication1 font.ttf

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

如果你想用PHP脚本来做这件事,而不是需要运行C代码(或者你像我一样在Mac上,而且你不能用Xcode编译,只能等待一年才能打开),下面是一个您可以使用PHP函数从字体中删除embedded权限:

 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源代码可以在这里find。

你可以通过下面的代码解决它

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

我发现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'); } 

我尝试了ttfpatch工具,但它并不适合我。 互联网爆炸者9和10仍然抱怨。

我发现这个不错的Git要点,它解决了我的问题。 https://gist.github.com/stefanmaric/a5043c0998d9fc35483d

只需复制并粘贴您的CSS中的代码。

我最近遇到这个问题,加载时在控制台中产生CSS3114和CSS3111错误的.eot和.otf字体。 对我而言,解决scheme是只使用.woff和.woff2格式的.ttf格式后备。 .woff格式将在大多数浏览器中的.ttf之前使用,似乎不会触发字体embedded权限问题(css3114)和字体命名不正确的格式问题(css3111)。 我在这篇关于CSS3111和CSS3114问题的非常有用的文章中find了我的解决scheme,并且阅读了关于使用@ font-face的这篇文章 。

注意:这个解决scheme不需要重新编译,转换或编辑任何字体文件。 这是一个纯CSS的解决scheme。 我testing过的字体确实有.eot,.otf,.woff,.woff2和.svg版本,可能是从原始的.ttf源文件产生3114错误,当我尝试它,但.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'); }