前置需求
- 下載
Html2Rtf.dll (免費元件)
- 以系統管理員身分執行:
regsvr32 Html2Rtf.dll 註冊 COM 元件
- PHP 啟用 COM 擴充:
php.ini 加入 extension=php_com_dotnet.dll
- 確認 Windows 服務 COM+ Event System 為啟動狀態
核心程式碼
<?php
try {
$html2rtf = new COM("Html2Rtf.Html2Rtf") or die("無法建立 COM 物件");
$html2rtf->PreserveImages = true;
$html2rtf->PageNumbers = 1;
$html2rtf->PageNumbersAlignH = 1; // 水平置中
$html2rtf->PageNumbersAlignV = 5; // 底部
$htmlFile = "input.html";
$rtfFile = "output.rtf";
$result = $html2rtf->ConvertFile($htmlFile, $rtfFile, "Header Text", "Footer Text");
if ($result) {
echo "轉換成功: $rtfFile";
} else {
echo "轉換失敗";
}
} catch (com_exception $e) {
echo "COM 錯誤: " . $e->getMessage();
}
?>
常見錯誤與解決
| 錯誤 | 原因 | 解決 |
| Class 'COM' not found | php_com_dotnet.dll 未載入 | php.ini 啟用 extension,重啟 Apache/IIS |
| Failed to create COM object | DLL 未註冊或版位不符 | 確認 regsvr32 成功、PHP 與 DLL 同為 32/64 位元 |
| Access denied | 權限不足 | IIS AppPool 身分需有 DLL 讀取權限、DCOM 設定允許啟動 |
| 轉換結果排版錯亂 | HTML 結構不相容 | 簡化 HTML、使用內嵌 CSS、避免 CSS Grid/Flex |
跨平台替代方案 (Linux/macOS/Docker)
| 工具 | 語言 | 特點 |
| Pandoc | Haskell | 支援 HTML→RTF/DOCX/PDF/MD,指令列/庫呼叫 |
| LibreOffice Headless | C++ | soffice --headless --convert-to rtf input.html |
| wkhtmltopdf + pdf2rtf | C++ | HTML→PDF→RTF 兩步驟 |
| PHPWord | PHP | 純 PHP 產生 DOCX/RTF/ODT,無外部相依 |
| DomPDF + 轉檔 | PHP | HTML→PDF,再用其它工具轉 RTF |
PHPWord 範例 (純 PHP,無 COM)
require 'vendor/autoload.php';
use PhpOffice\PhpWord\IOFactory;
$html = file_get_contents('input.html');
$phpWord = IOFactory::load('input.html', 'HTML'); // 需支援 HTML 讀取
$writer = IOFactory::createWriter($phpWord, 'RTF');
$writer->save('output.rtf');