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

我正在构建一个小型的内部网应用程序,并尝试使用我最近购买的 Adobe 字体,但没有成功。据我所知,在我们的情况下,这不是违反许可证。

我把。TTF/.字体的 otf 版本。沃夫。还有。Svg,因此可以针对所有主要浏览器。我使用的@font-face 语法基本上是 丰泉中的防弹语法:

@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 = “ *”)以允许跨域引用

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/.关机。我也得到一个 。 afm文件,但我不知道它是否重要或不..。

有什么办法吗?

[编辑]-我托管我的网站(字体太,但在单独的目录和子域静态内容)下的 IIS 7.5

101920 次浏览

问题可能与您的服务器配置有关——它可能没有为字体文件发送正确的头文件。看一下问题 IE9阻止跨源网络字体的下载的答案。

EricLaw 建议在 Apache 配置中添加以下内容

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

我只能解释如何修复“ CSS3114”错误。
您必须更改 TTF 文件的嵌入级别。

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

的确,IE9要求将 tTF 字体的嵌入位设置为 Installable。Generator 会自动执行此操作,但是我们目前因为其他原因而阻止了 Adobe 字体。我们可能在不久的将来取消这一限制。

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

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

我得到了以下错误:

CSS3114:@font-face OpenType 嵌入权限检查失败。权限必须是可安装的。
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>

对于所有在使用 ttfpatch 时出现错误的人: “ tableversion 必须是0、1或者是十六进制: 003”,我已经编译了64位嵌入。我没有改变任何东西,只是添加需要库和编译。使用风险自负。

用法: Console Application1 font.ttf

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

作为一个 Mac 用户,我无法使用 MS-DOS 和 Windows 命令行工具来修复字体嵌入权限。但是,我发现您可以使用 FontLab 来修复这个问题,将权限设置为“ Everything is allow”。我希望这个关于如何 在 Mac OS x 上将字体权限设置为 Installable的菜谱对其他人也有用。

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

用法:

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

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

  3. 键入 embed fontname.fonttype,将 fontname 替换为 filename,将 fonttype 替换为扩展名,即 embed brokenFont.ttf

  4. 完成了! 你的字体现在应该可以工作了。

您可以通过以下代码来解决这个问题

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

因为这个问题,我浪费了很多时间。 最后我自己找到了一个很好的解决办法。在我吸毒之前。只能使用 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);
}

我希望这能帮到别人。

如果您熟悉 nodejs/npm,那么 Ttembed-js是在 TTF 字体上设置“可安装嵌入允许”标志的一种简单方法。这将修改指定的。Ttf 文件:

npm install -g ttembed-js


ttembed-js somefont.ttf

如果你想用 PHP 脚本来做这件事,而不是运行 C 代码(或者你像我一样在 Mac 上,你不能用 Xcode 编译,只是等待一年打开它) ,这里有一个 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 可以找到 给你

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

不同的答案: 法律问题。

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

你需要明白的是这是一个许可问题。也就是说,如果你试图加载一个导致这个错误的字体,你没有文件使用这个字体的权限,如果你没有这个权限,你很可能会因为以这种方式使用这个字体而输掉一场法律战(这本身是很不可能的) ,除非你持有这个许可证。所以,你可以第一次感谢 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

我试了一下 ttfpatch 工具,它对我不起作用,因特网爆炸器9和10仍然抱怨。

我找到了这个不错的 Git 要点,它解决了我的问题

把代码复制粘贴到你的 CSS 里。

我最近遇到了这个问题。还有。在加载时在控制台中产生 CSS3114和 CSS3111错误的 otf 字体。对我有效的解决办法是只使用。沃夫和。Woff2格式使用。Ttf 格式后备方案。那个。之前将使用 woff 格式。在大多数浏览器和似乎没有触发字体嵌入权限问题(css3114)和字体命名不正确的格式问题(css3111)。我在 这篇关于 CSS3111和 CSS3114的文章非常有帮助中找到了我的解决方案,也在阅读 关于使用@font-face 的文章

注意: 此解决方案不需要重新编译、转换或编辑任何字体文件。这是一个只有 CSS 的解决方案。我测试的字体确实有。Eot.好吧。沃夫。Woff2和。为它生成的 svg 版本,可能来自最初的。当我尝试的时候,它确实产生了3114错误,但是。沃夫和。Woff2文件似乎对这个问题免疫。

这就是“ 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');
}

这就是引发 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');
}

这对我有用:

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

如果你想使用 Python 脚本而不是运行 C/PHP 代码,这里有一个 Python 3函数,你可以使用它来删除字体的嵌入权限:

def convert_restricted_font(filename):
with open(filename, 'rb+') as font:


font.read(12)
while True:
_type = font.read(4)
if not _type:
raise Exception('Could not read the table definitions of the font.')
try:
_type = _type.decode()
except UnicodeDecodeError:
pass
except Exception as err:
pass
if _type != 'OS/2':
continue
loc = font.tell()
font.read(4)
os2_table_pointer = int.from_bytes(font.read(4), byteorder='big')
length = int.from_bytes(font.read(4), byteorder='big')
font.seek(os2_table_pointer + 8)


fs_type = int.from_bytes(font.read(2), byteorder='big')
print(f'Installable Embedding: {fs_type == 0}')
print(f'Restricted License: {fs_type & 2}')
print(f'Preview & Print: {fs_type & 4}')
print(f'Editable Embedding: {fs_type & 8}')


print(f'No subsetting: {fs_type & 256}')
print(f'Bitmap embedding only: {fs_type & 512}')


font.seek(font.tell()-2)
installable_embedding = 0 # True
font.write(installable_embedding.to_bytes(2, 'big'))
font.seek(os2_table_pointer)
checksum = 0
for i in range(length):
checksum += ord(font.read(1))
font.seek(loc)
font.write(checksum.to_bytes(4, 'big'))
break




if __name__ == '__main__':
convert_restricted_font("19700-webfont.ttf")

它工作,但我最终解决的问题,加载字体在 IE 的 https 像这样的 这个

谢谢 NobleUplift

原始来源 C 可以找到 给你