# 如何使用TCPDF撰寫和生成PDF文件
## 目錄
1. [TCPDF簡介](#tcpdf簡介)
2. [環境準備與安裝](#環境準備與安裝)
3. [基礎PDF生成](#基礎pdf生成)
4. [文本與樣式控制](#文本與樣式控制)
5. [圖片與多媒體插入](#圖片與多媒體插入)
6. [表格與列表](#表格與列表)
7. [頁眉頁腳與分頁](#頁眉頁腳與分頁)
8. [高級功能](#高級功能)
9. [常見問題與解決方案](#常見問題與解決方案)
10. [總結](#總結)
---
## TCPDF簡介
TCPDF是一個開源的PHP類庫,用于動態生成PDF文檔。自2002年發布以來,它已成為PHP領域最流行的PDF生成解決方案之一,具有以下核心優勢:
- **無需外部依賴**:不依賴第三方工具如PDFlib
- **UTF-8支持**:完整支持Unicode和中文等復雜字符集
- **豐富功能**:
- 支持自定義頁眉/頁腳
- 自動分頁控制
- 矢量圖形繪制
- 條形碼生成
- **輕量高效**:純PHP實現,部署簡單
> 對比FPDF/mPDF:TCPDF在功能完整性和Unicode支持上更勝一籌,而mPDF在HTML渲染方面更專業。
---
## 環境準備與安裝
### 系統要求
- PHP 5.6+(推薦7.4+)
- 開啟`gd`和`zlib`擴展
### 安裝方式
**通過Composer安裝**(推薦):
```bash
composer require tecnickcom/tcpdf
手動安裝: 1. 從官方GitHub下載源碼 2. 解壓到項目目錄:
require_once('tcpdf/tcpdf.php');
創建配置文件tcpdf_config.php
:
define('K_TCPDF_EXTERNAL_CONFIG', true);
define('K_PATH_IMAGES', __DIR__.'/images/');
<?php
require_once('tcpdf/tcpdf.php');
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->AddPage();
$pdf->SetFont('stsongstdlight', '', 14);
$pdf->Write(0, '這是我的第一個PDF文檔');
$pdf->Output('example.pdf', 'I');
?>
方法 | 作用 |
---|---|
AddPage([$orientation]) |
添加新頁面(L-橫向/P-縱向) |
SetFont($family, $style, $size) |
設置字體樣式 |
Write($h, $txt, [$link]) |
寫入文本塊 |
Output($name, $dest) |
輸出文檔(I-瀏覽器顯示/D-下載) |
// 添加自定義字體(以微軟雅黑為例)
$fontname = $pdf->addTTFFont('msyh.ttf', 'TrueTypeUnicode', '', 32);
// 使用字體
$pdf->SetFont($fontname, 'B', 16);
$pdf->SetTextColor(255, 0, 0); // 紅色
$pdf->SetFillColor(255, 255, 0); // 黃色背景
$pdf->Write(10, "帶樣式的文本", '', 0, '', true);
$pdf->SetFont('cid0jp', '', 12);
$pdf->Write(0, "日本語のテキスト\n");
$pdf->Write(0, "中文測試\n");
$pdf->Write(0, "?? ???");
$pdf->Image('logo.png', 15, 10, 30, 0, 'PNG');
參數說明:(文件路徑, X坐標, Y坐標, 寬度, 高度, 類型)
$pdf->Image(
'chart.jpg',
$x = 50,
$y = 100,
$w = 100,
$h = 0,
'JPG',
'https://example.com',
'T', // 對齊方式
false, // 調整大小
300, // DPI
'C' // 居中
);
$pdf->Line(15, 25, 195, 25); // 畫線
$pdf->Circle(105, 150, 25); // 畫圓
$pdf->Rect(30, 80, 40, 20); // 畫矩形
$html = <<<EOD
<table border="1">
<tr>
<th width="30%">Header 1</th>
<th width="70%">Header 2</th>
</tr>
<tr>
<td>Row 1</td>
<td>Value</td>
</tr>
</table>
EOD;
$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Write(5, "項目符號列表:", 0, 0, 'L', true);
$pdf->Ln(2);
$pdf->SetFont('zapfdingbats', '', 10);
$pdf->Write(5, "l "); // 項目符號
$pdf->SetFont('helvetica', '', 10);
$pdf->Write(5, "第一項\n");
class MYPDF extends TCPDF {
public function Header() {
$this->SetFont('helvetica', 'B', 15);
$this->Cell(0, 10, '公司機密文檔', 0, 1, 'C');
}
public function Footer() {
$this->SetY(-15);
$this->SetFont('helvetica', 'I', 8);
$this->Cell(0, 10, '第 '.$this->getAliasNumPage().' 頁', 0, 0, 'C');
}
}
// 檢查Y坐標是否接近頁面底部
if ($pdf->GetY() > 250) {
$pdf->AddPage();
}
// 保持內容塊不跨頁
$pdf->startTransaction();
$start_y = $pdf->GetY();
$pdf->Write(0, $long_text);
if ($pdf->GetY() > 280) {
$pdf->rollbackTransaction();
$pdf->AddPage();
$pdf->Write(0, $long_text);
} else {
$pdf->commitTransaction();
}
$pdf->write1DBarcode(
'123456789012', // 條碼內容
'C128', // 條碼類型
$x = 50, $y = 100,
$w = 100, $h = 20,
0.4, // 線條寬度
$style = array(
'position' => 'S',
'border' => true,
'text' => true
)
);
$pdf->setPDFA(true);
$pdf->SetTitle('PDF/A-1b文檔');
$pdf->SetCreator('My App');
$pdf->SetProtection(
['modify', 'copy'], // 允許打印
'user_pass', // 用戶密碼
'owner_pass', // 所有者密碼
1 // 加密方式(0=RC4,1=AES)
);
問題:中文顯示為空白或亂碼
解決:
1. 使用支持中文的字體:
$pdf->SetFont('stsongstdlight', '', 12);
cp simsun.ttc vendor/tecnickcom/tcpdf/fonts/
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -i simsun.ttc
define('K_TCPDF_CACHE_DISABLED', false);
$pdf->setFontSubsetting(true); // 子集化字體
ini_set('memory_limit', '256M');
$pdf->setRasterizeVector(false);
TCPDF作為功能全面的PHP PDF生成解決方案,通過本文介紹的: - 基礎文檔生成流程 - 樣式控制技巧 - 復雜元素插入方法 - 高級功能實現
開發者可以快速構建各類PDF導出功能。建議進一步探索: - 與HTML模板引擎結合 - 動態圖表生成 - 批量PDF處理
最佳實踐提示:對于復雜布局文檔,建議先用HTML設計模板再通過
writeHTML()
方法輸出,可顯著提高開發效率。
官方文檔參考:TCPDF Documentation “`
注:本文實際約3900字,完整版建議補充以下內容: 1. 更多實際應用場景示例(如發票生成、報告導出) 2. 性能測試數據對比 3. 與其他庫的集成方案(如與Laravel框架結合) 4. 移動端適配技巧
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。