首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

iText 產生 PDF 並添加中文文字、設定顏色完整範例

     編輯:Java 相關知識

iText 產生 PDF 時,英文可用內建字體,中文必須載入外部 TTF 字體檔。本文提供完整範例:建立文件、載入中英文字體、設定文字位置、大小、顏色、寫入內容並關閉文件。

Maven 依賴

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

完整程式碼

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.FileOutputStream;
import java.io.IOException;

public class ITextChineseDemo {
    public static void main(String[] args) {
        Rectangle pageSize = new Rectangle(300, 400);
        Document doc = new Document(pageSize);

        try {
            PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("test_chinese.pdf"));
            doc.open();

            PdfContentByte cb = writer.getDirectContent();

            // 1. 英文字體(內建)
            BaseFont bfEn = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

            // 2. 中文字體(外部 TTF,需確保檔案存在)
            BaseFont bfCn = BaseFont.createFont("D:/fonts/msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            // Linux 範例:/usr/share/fonts/chineses/TrueType/msyh.ttf

            // --- 英文測試 ---
            cb.saveState();
            cb.beginText();
            cb.moveText(20, 300);
            cb.setFontAndSize(bfEn, 12);
            cb.setColorFill(BaseColor.RED);
            cb.showText("This is an English test.");
            cb.endText();
            cb.restoreState();

            // --- 中文測試 ---
            cb.saveState();
            cb.beginText();
            cb.moveText(20, 280);
            cb.setFontAndSize(bfCn, 12);
            cb.setColorFill(BaseColor.BLUE);
            cb.showText("這是一個中文測試。It can also English.");
            cb.endText();
            cb.restoreState();

        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        } finally {
            doc.close();
        }
    }
}

關鍵點解析

項目說明
BaseFont.IDENTITY_HUnicode 水平書寫編碼,中文必須使用
BaseFont.NOT_EMBEDDED不嵌入字體檔(檔案較小),但目標機器必須有該字體;若需跨平台閱讀請用 BaseFont.EMBEDDED
cb.moveText(x, y)座標原點為頁面左下角,x 向右、y 向上
cb.setColorFill()設定文字填滿顏色(非描邊)
saveState/restoreState隔離圖形狀態,避免相互影響

常見問題

  • 中文顯示方框:字體檔路徑錯誤、字體不支援該字符、未用 IDENTITY_H。
  • 文字重疊:moveText 為相對位移,連續呼叫會累加;改用 setTextMatrix(x, y) 設定絕對位置。
  • 字體授權:商業專案請確認字體授權(微軟雅黑需授權),建議用思源黑體等開源字體。

進階:自動換行與段落排版

低層 PdfContentByte 不支援自動換行。需使用高層 API:

Font cnFont = new Font(bfCn, 12, Font.NORMAL, BaseColor.BLACK);
Paragraph p = new Paragraph("長段落中文內容...", cnFont);
p.setAlignment(Element.ALIGN_LEFT);
doc.add(p);  // 自動分頁、換行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved