0

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

4

1 回答 1

2

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

您声称这FontFactory.getFont()需要文件系统上的字体文件。这并没有错。但是,这并不意味着您不能从byte[].

您正试图通过ttf在磁盘上保存 a 来解决您的问题(这是您的客户禁止的),但这不是必需的。在某种程度上,您的客户是对的:将 TTF 作为临时文件保存在磁盘上并不是一个好主意(这就是我忽略您的第二个问题的原因)。

看看下面的createFont()方法

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 软件的商业许可证。

于 2014-11-12T08:01:41.663 回答