0

iTextPdf 5.5.3 を使用して PDF/A ドキュメントを作成しています。ユーザーがフォントの.ttfファイルをアップロードしてカスタム フォントを選択するようにしたいのですが、FontFactory.getFont()メソッドはフォント名のみを文字列として受け取るため、アップロードしたファイルを書き込む必要があります。ユーザーのドライブに ( I KNOW , I ASKED MY CUSTOMER FOR PERMISSION TO WRITE TO THE DRIVE)、アップロードしたファイルのパスを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(これは顧客によって禁止されています) が、これは必須ではありません。ある意味で、あなたの顧客は正しいです。TTF を一時ファイルとしてディスクに保存するのは得策ではありません (そのため、2 番目の質問は無視しています)。

次の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 に答える