我正在使用iTextPdf 5.5.3创建PDF / A文档,我希望用户通过上传字体的 .ttf 文件来选择自定义字体,并考虑FontFactory.getFont()
方法只将字体名称作为字符串我必须将上传的文件写入用户的驱动器(我知道,我请求我的客户允许写入驱动器)然后通过上传文件到getFont()
方法的路径,一切都完成后我想从驱动器中删除上传的文件。这是我的代码:
File fontFile = new File("d:/temp/testFont.ttf");
try {
FileOutputStream outStream = new FileOutputStream(fontFile);
outStream.write(the bytes of the uploaded font file);
outStream.flush();
outStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Font font = FontFactory.getFont(fontFile.getAbsolutePath(), BaseFont.CP1250 , BaseFont.EMBEDDED);
fontFile.delete();
此代码无效,getFont()
方法以某种方式锁定字体文件,因此文件未被删除。我尝试了很多方法来实现这一点,例如:fontFile.deleteOnExit();
或FileDeleteStrategy.FORCE.delete("file path");
,但没有任何方法可以帮助我。请指教。感谢
答案 0 :(得分:2)
我不会回答你帖子标题中提到的问题(因为它是次要的)。相反,我将回答身体中的问题(这是必不可少的问题)。
您声称FontFactory.getFont()
需要文件系统上的字体文件。这不是不正确的。但是,这并不意味着您无法从byte[]
创建字体。
您正试图通过在磁盘上保存ttf
来解决您的问题(您的客户禁止),但这不是必需的。在某种程度上,您的客户是对的:将TTF保存为磁盘上的临时文件并不是一个好主意(这就是为什么我忽略了您的第二个问题)。
看看the following createFont()
method:
public static BaseFont createFont(String name,
String encoding,
boolean embedded,
boolean cached,
byte[] ttfAfm,
byte[] pfb)
throws DocumentException,
IOException
这就是你应该如何解释你的案例中的参数:
name
- 字体名称(不是位置)encoding
- 要应用于此字体的编码embedded
- true
如果字体要嵌入PDF cached
- 可能是false
,因为您不会重复使用JVM中的字体ttfAfm
- .ttf文件的字节pfb
- 在您的情况下,此值将为null
(仅在Type1字体的上下文中有意义。)现在您可以满足客户的要求,而无需引入次优的解决方法。
注意:您使用的是AGPL下的iText 5.5.3。请注意,一旦他开始在网络服务,产品中使用iText,您的客户将需要使用iText软件购买商业许可证......