gpt4 book ai didi

java - 调用 FontFactory.getFont() 方法后无法删除文件

转载 作者:行者123 更新时间:2023-12-02 05:16:50 34 4
gpt4 key购买 nike

我正在使用 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"); 但没有任何效果对我有用。请指教。谢谢

最佳答案

我不会回答您帖子标题中提到的问题(因为它是次要的)。相反,我将回答正文中的问题(这是基本问题)。

您声称 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 软件的商业许可证...

关于java - 调用 FontFactory.getFont() 方法后无法删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26864253/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com