itextpdf中国語の文字化け問題の研究

2623 ワード

最近はjavaコードでpdfを生成するつもりですが、結果としてitextpdfを見つけました。とても強いと思います。ネットで中国語をサポートしていません。itextAsiaを引用して長い間中国語で文字化けをしました。
彼はネット上の様々な方法で中国語を生成できますが、文字化けです。仕方なく文字セットを調べてみました。すべてはCharete.defaultCharrset()から始まります。
System.out.println(Charett.default Charrst);出力結果がGBKであれば、恐れ入りますが、文字化けは正常です。UTF 8であれば、文字化けがないことをおめでとうございます。オンラインで何をダウンロードすると聞きましたが、extrajars-23.3.zipはほとんど弱くなりました。実は何もダウンロードしなくてもいいです。
implementation group: 'com.itextpdf', name: 'itextpdf', version: '+'
implementation group: 'com.itextpdf', name: 'itext-asian', version: '+'
バージョンを指定したい場合:
implementation group: 'com.itextpdf', name: 'itextpdf', version: '5.4.4'
implementation group: 'com.itextpdf', name: 'itext-asian', version: '5.2.0'
実は文字化けが乱れていません。バージョンとは関係ありません。
下記のプログラムを実行すると文字化けします。
public static void main(String[] args) throws Exception{
    
    Document document = new Document();

    PdfWriter.getInstance(document, new FileOutputStream("createSamplePDF.pdf"));

    BaseFont bfChinese = BaseFont.createFont( "STSongStd-Light" , "UniGB-UCS2-H" , false);
    Font font = new Font(bfChinese, 14, Font.NORMAL);

    document.addAuthor("WESTDREAM");
    document.addTitle("Test iText");
    document.addSubject("This is an iText demo");
    document.addKeywords("iText keywords");
    document.addCreator("Using iText");
    document.open();
    document.add(new Paragraph(" dfds      3333", font));
    document.close();
    System.out.println(Charset.defaultCharset().name());
}
コンソールがGBKを出力すると文字化けが発生します。もしあなたのコンソールがUTF 8を出力すれば文字化けはしません。
私たちがdefault Charrsetを変えるなら、すべて解決しますが、あいにくあなたのプログラムは運行環境に依存しています。これはよくないです。次のように変更します。
default Charrsetを変えたくないなら、文字列をutfコードに変えたらいいじゃないですか?
Dcument.add(new Paraph)//文字化け
document.add(new Paragraph(new String(" dfds      3333".getBytes(), "utf8"), font));//    
このようにするメリットは、あなたのシステムがどんな文字を使っているかに関わらず、私はすべてutf 8に変えます。だから問題は解決して、フォントを導入する必要はなくて、この二つのカバンだけが必要です。一刀切れば環境変数を設定します。
windows    jdk       →   “JAVA_TOOL_OPTIONS”   ,  “-Dfile.encoding=UTF-8”
linuxは試したことがありません。このような環境に依存する方式は嫌です。だからツールを準備しましょう。
public static String getUTF8String(String string){
    if (string != null){
        try{
            return new String(string.getBytes(), "utf8");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    return "hah string to utf8 fail";
}