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

PHP 實現類百度文庫/豆丁網線上文檔預覽:Word/Excel/PPT 轉 Flash/SWF 兩大方案完整實戰

     編輯:PHP 綜合知識

需求背景

使用者上傳 Office 文件,網頁需像百度文庫、豆丁網一樣**線上預覽、翻頁、縮放、全螢幕**,不需下載。核心技術路線:

  1. Office → PDF
  2. PDF → SWF (每頁一個 Shadow/Frame)
  3. Flash/AS3 或 HTML5/JS (PDF.js) 載入 SWF/PDF 渲染翻頁

方案一:FlashPaper (已停止更新,不推薦新專案)

原理

安裝虛擬印表機驅動 → 列印文件 → 截獲 EMF → 轉 SWF/PDF。

命令列呼叫

"C:\Program Files\Macromedia\FlashPaper 2\FlashPrinter.exe" "input.ppt" -o "output.swf"

PHP 整合

exec('"C:\Program Files\Macromedia\FlashPaper 2\FlashPrinter.exe" "input.docx" -o "output.swf"', $out, $ret);
if ($ret !== 0) throw new Exception("FlashPaper 轉換失敗: " . implode("\n", $out));

致命缺點

  • ❌ **無法並發**:單一虛擬印表機,同一時間只能轉一個檔
  • ❌ **需桌面互動**:Windows Server 需開啟「互動式服務」,容器化極難
  • ❌ **已停更**:Adobe 2008 年停止開發,不支援新版 Office、新版 Windows
  • ❌ **中文亂碼**:字體嵌入問題頻發

方案二:OpenOffice/LibreOffice + swftools (開源、可並發、跨平台、主流方案)

架構圖

使用者上傳 → PHP 儲存 → 佇列 → Worker 呼叫
    1. LibreOffice (headless) --convert-to pdf → output.pdf
    2. swftools pdf2swf -T 9 output.pdf -o output.swf
    3. 回傳 SWF 路徑 / 狀態
前端 AS3/JS 載入 SWF 序列 → 翻頁預覽

CentOS 7 / Ubuntu 安裝步驟

# 1. 安裝 LibreOffice (無介面)
yum install -y libreoffice-headless fonts-chinese  # CentOS
apt-get install -y libreoffice fonts-wqy-zenhei    # Ubuntu

# 2. 安裝 swftools
yum install -y swftools   # 或從源碼編譯 ./configure --prefix=/usr/local/swftools && make install

# 3. 啟動 LibreOffice Socket 服務 (常駐,避免每次冷啟動)
/opt/libreoffice/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

# 4. PHP 呼叫 (使用 JODConverter 或直呼指令)
# 直呼指令範例:
exec('libreoffice --headless --convert-to pdf --outdir /tmp/upload/ /tmp/upload/input.docx 2>&1', $out, $ret);
exec('/usr/local/swftools/bin/pdf2swf -T 9 /tmp/upload/input.pdf -o /tmp/upload/input.swf 2>&1', $out, $ret);

JODConverter 方案 (推薦生產環境)

  1. 下載 `jodconverter-core-4.x.jar` + `jodconverter-local-4.x.jar`
  2. Java 程式碼:
    LocalConverter converter = LocalConverter.builder()
        .officeHome("/opt/libreoffice")
        .portNumbers(8100)
        .build();
    converter.convert(new File("input.docx")).to(new File("output.pdf")).execute();
  3. PHP 透過 `exec('java -jar converter.jar ...')` 或建立微服務 (Spring Boot) 提供 REST API

關鍵參數說明

參數 說明
`pdf2swf -T 9`輸出 **Flash Player 9** 相容 SWF (ActionScript 3),否則預設輸出 FP7/8,AS3 無法操作
`-s poly2bitmap`複雜向量轉位圖,避免渲染錯誤
`-s zoom=100`縮放比例

前端播放器選擇

方案 技術 優點 缺點
FlexPaper / FlowPaperAS3 / JS成熟商業元件、支援註釋、搜尋、下載控制需授權費、Flash 瀏覽器已淘汰
PDF.js (Mozilla)純 JS + Canvas**無需 Flash**、支援文字選取、搜尋、響應式、行動裝置完美大檔案渲染較慢、複雜排版偶有誤差
自製 AS3 PlayerAS3完全控制開發成本高、Flash 死路一條

2024+ 專案強烈建議:Office → PDF → PDF.js,徹底避開 Flash/SWF 技術債。

現代化架構建議 (微服務 + 物件儲存 + PDF.js)

[上傳 API] → [MinIO/S3] → [轉換佇列] → [Worker: LibreOffice + pdf2swf/pdf2htmlEX] → [MinIO/S3] → [前端 PDF.js 載入]
     │                                                           │
     └────────────── 狀態輪詢 / WebSocket 推送 ────────────────┘
  • **非同步解耦**:上傳即回應,轉換失敗不影響主流程
  • **水平擴展**:Worker 可依佇列長度自動擴容
  • **格式彈性**:同步產出 PDF (給 PDF.js)、SWF (舊版相容)、縮圖、文字內容 (供全文搜尋)
  • **安全性**:轉換在隔離容器/沙箱執行,防惡意文件攻擊

常見坑與解決

  • 🐛 **中文亂碼** → 容器安裝中文字體 (`fonts-wqy-zenhei`, `fonts-noto-cjk`),LibreOffice 重啟
  • 🐛 **轉換超時** → 大檔案拆分、調大 `max_execution_time`、Worker 設定 Timeout
  • 🐛 **並發衝突** → LibreOffice 單執行緒,啟動多個實例不同 port (8100, 8101...),Worker 輪詢分發
  • 🐛 **記憶體爆炸** → 限制單檔大小 (如 50MB)、監控 OOM Kill、定期重啟 Worker
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved