开发者

Get font file as a File object or get its path

开发者 https://www.devze.com 2022-12-15 13:48 出处:网络
I have a Font object in Java for a font file. I need to convert that object to a File object or get the font file path.

I have a Font object in Java for a font file. I need to convert that object to a File object or get the font file path.

Is there a way to do this?


What开发者_开发技巧 I'm doing here is calling a method from an external library that loads a font file to use it in writing:

loadTTF(PDDocument pdfFile, File fontfile);

So I wanted to let the user choose a font from the ones defined in his operating system using :

GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font[] fonts = e.getAllFonts();

Then when the user chooses a font, I pass it to the loadTTF(...) method to load it.

Is there a bad practice here?


// use reflection on Font2D (<B>PhysicalFont.platName</B>) e.g.
Font f = new Font("Courier New", 0, 10);

Font2D f2d = FontManager.findFont2D(f.getFontName(), f.getStyle(),      
               FontManager.LOGICAL_FALLBACK).handle.font2D;

Field platName = PhysicalFont.class.getDeclaredField("platName");
platName.setAccessible(true);
String fontPath = (String)platName.get(f2d);
platName.setAccessible(false);

// that's it..
System.out.println(fontPath);


Ok ... This will return the font file path :

String fontFilePath = FontManager.getFontPath( true ) + "/" + FontManager.getFileNameForFontName( fontName );

I have tried this in Windows and Linux and in both it worked fine.


No.

A Font in Java is just a representation and definition of how characters can be displayed graphically. It has nothing to do with the filesystem, and technically need not even be ultimately defined in a file (see for example the createFont() method that takes an arbitrary input stream, which could come from anywhere e.g. a network socket). In any case, it would certainly be a ridiculous break in abstraction for you to be able to get the path of the underlying system file that defines the font.

I would suggest that you might be doing the wrong thing in your other method if you're relying on accepting a file. Or if this really is needed, then you're doing the wrong thing in this method by thinking that a Font object has a simple correlation to an underlying file. If you really need to get the file path of a particular font you'll need to approach it from a different angle that doesn't involve java.awt.Font.

0

精彩评论

暂无评论...
验证码 换一张
取 消