为什么抛出java.awt.FontFormatException,但是我可以在windows中打开tff文件

为什么抛出java.awt.FontFormatException,但是我可以在windows中打开tff文件,java,fonts,Java,Fonts,代码如下: Font getFont(String fontPath) throws IOException, FontFormatException { fis = new FileInputStream(fontPath); bis = new java.io.BufferedInputStream(fis); Font tmp = null; try { tmp = Font.createFont(Fo

代码如下:

Font getFont(String fontPath) throws IOException, FontFormatException {
        fis = new FileInputStream(fontPath);
        bis = new java.io.BufferedInputStream(fis);
        Font tmp = null;
        try {
            tmp = Font.createFont(Font.TRUETYPE_FONT, bis);
        } catch (FontFormatException e) {
            e.printStackTrace();
            bis.close();
            fis = new FileInputStream(fontPath);
            bis = new java.io.BufferedInputStream(fis);
            tmp = Font.createFont(Font.TYPE1_FONT, bis);
        }

        return tmp.deriveFont(96.0f);
    }
这段代码并不总是有效的
它会对某些字体文件抛出java.awt.FontFormatException,但是,该字体文件可以在windows中正确打开…为什么

它将首先抛出: java.awt.FontFormatException:找不到字体名称

然后扔:
java.awt.FontFormatException:错误的pfa字体

请尝试在您的计算机上运行此操作。将
rootPath
替换为字体的路径

public class FontLoader {
    public static void main(String[] args) {
        String rootPath = "/Library/Fonts";

        File root = new File(rootPath);
        if (root.canRead()) {
            String[] fontFiles = root.list();

            Font font = null;
            for (String fontFile : fontFiles) {
                try {
                    System.out.println(fontFile);
                    font = Font.createFont(Font.TRUETYPE_FONT, new File(root
                            + "/" + fontFile));
                    System.out.println(font);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

您应该能够无限次地运行代码,如果是这样的话,那么您可能需要对代码进行某种程度的重新构造—输入流上的关闭/打开堆栈看起来有点可疑。我这样说,没有看到您在哪里声明这些实例变量,也没有看到其他代码可能在操作它们。

我也有同样的问题。我发现TTF文件被写入了一个临时文件。然后处理此文件,并引发FontFormatException(找不到字体名称)异常,因为TrueTypeFont实例中未设置此属性。这有点奇怪,因为我已经验证了tmp字体文件的元数据,而这个文件确实包含所需的元数据。。。我通过从网上下载TTF文件解决了这个问题。我猜OSX的foo.TTF与Windows的foo.TTF不一样。然而,通过用下载的字体替换所有嵌入的字体,我最终解决了我的问题。