【问题标题】:Can't delete file after calling FontFactory.getFont() method调用 FontFactory.getFont() 方法后无法删除文件
【发布时间】:2014-11-12 16:01:41
【问题描述】:

我正在使用 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");,但没有什么对我有用。请指教。谢谢

【问题讨论】:

    标签: java fonts itext itextpdf delete-file


    【解决方案1】:

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

    您声称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。请注意,您的客户一旦开始在 Web 服务、产品中使用 iText,就需要购买 iText 软件的商业许可证...

    【讨论】:

    • 谢谢布鲁诺先生,尽管我还有一个关于字体编码的问题。使用 BaseFont.createFont 方法创建字体时如何知道应该使用哪种编码?
    • 您最安全的选择是使用 Identity-H,因为这允许您使用 UNICODE。大多数现代字体都支持它。如果字体不支持,则会抛出异常。由您决定是拒绝这种字体(可能是最佳选择)还是向用户提供可用编码列表(冒着用户不知道您在说什么的风险)。
    猜你喜欢
    • 2013-07-26
    • 2022-01-22
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多