PowerPoint 轉 PDF
一張投影片一頁,在這個分頁裡轉完,不會被上傳。
本機處理把檔案拖進來,或點擊選擇
支援 PPTX。沒有大小上限,不用註冊。
選好檔案之後,這一頁會先把它的結構讀出來 —— 分欄、文字方框、圖表、公式,以及它要畫的每一個字 —— 然後告訴你哪些會保留、哪些不會。這個檢查在轉檔之前就跑完,而且整個過程沒有任何一個位元組離開這個分頁。
這個工具不做的事
- 圖表不轉換,投影片上那一塊會是空白。
- 約四十種圖形會精確畫出。DrawingML 規格裡其餘的形狀以矩形近似 —— 位置對、顏色對、輪廓不對。
- 漸層會變成單色:所有色停的平均值。
- 動畫、換頁效果、影片與音訊不會在輸出裡。PDF 是靜態格式。
- SmartArt 是用 PowerPoint 存在檔案裡的後備圖畫出來的,不是用它的佈局引擎,所以細節可能有差。
隨站的中文字型是 Noto Sans TC,授權為 SIL Open Font License 1.1,授權全文隨檔案一起提供。OFL 第 5 節末句明文寫著「使用本字型產生的文件」不受「必須維持在本授權下」這個要求約束 —— 也就是你在這裡下載的 PDF 本身不帶任何授權義務。看字型授權
這一頁會讀你的 .pptx、照真實尺寸把每一張投影片畫出來,然後寫成一張投影片一頁的 PDF —— 在你的瀏覽器裡完成,沒有上傳。文字保持可選取、可搜尋。轉換之前它會先檢查這份簡報,並具名指出畫不出來的東西 —— 因為某一張投影片會變成空白,這件事值得事先知道。
投影片其實比文件好轉,這件事出乎我們意料
一般的假設是三種 Office 格式裡簡報最難轉。做完之後我們改變了看法。投影片是絕對定位:每個圖形自己帶著位移與尺寸,所以沒有文字流要算、沒有跨頁斷行、根本沒有分頁邏輯。反而是 Word 文件那一套 —— 換行、分頁、表格高度計算 —— 才是明顯更難的排版問題。
.pptx 真正的難處在另一個地方:繼承。投影片上的一個圖形常常沒有自己的位置、顏色與字型。它只說「我是標題佔位框」,真正的值住在版面配置裡,版面配置沒有的話再往母片找,而母片裡的顏色又是指向主題色盤的間接引用。跳過這條鏈,一張有標題加三個項目的投影片就會變成一張白紙。
我們量過這件事的代價。八份真實的 PowerPoint 檔案 —— 由檔案內的產生者字串鑑定為真的 Microsoft Office 輸出 —— 把版面配置與母片繼承解出來之後,其中五份的文字留存率從 0% 到 13% 之間變成 100%。一份用自訂母片的簡報從一張完全空白的頁面變成完整的一頁。整個功能的成本大約是 10 KB 的壓縮後程式碼。
這次實作學到的一課:0 常常是「自動」而不是「零」
OOXML 用 0 當哨兵值的頻率遠超預期,而 JavaScript 讓這個陷阱更糟 —— 因為字串 "0" 在 JavaScript 裡是真值。表格列寫成 h="0" 不代表零高度的列,它的意思是「請 PowerPoint 自動決定高度」。用單純的真假判斷去讀它,整張表的每一列會疊在同一條線上,而表頭底色也會一起消失,因為它同樣沒有高度。
同一個模式在一次實作裡咬了我們四次。一個尺寸為 0 又帶自動調整旗標的文字框,是「自動決定大小」的框;把它當成零高度的框,我們丟掉了二十九段正文。一條寬或高為 0 的連接線,是水平線或垂直線,不是隱形的線。屬性 showMasterSp="0" 的意思是「不要畫母片上的裝飾圖元」,跟真假判斷得到的結論正好相反。粗體寫成 b="0" 的意思是「明確地不要粗體」—— 當它繼承的樣式本來是粗體時,那是一個真的指令。
這四個的輸出都能通過粗略的檢查:檔案有產生、頁數正確、沒有拋錯、文字層大致正確。它們是靠把 PDF 渲染回點陣圖、跟基準並排看才抓到的 —— 而那現在就是這一系列工具每一個的驗證方式。
哪些會轉得好,哪些會不見
文字與它的格式轉得不錯:標題、多層項目符號(含真正的符號字元)、逐段的粗體斜體底線顏色與字級、對齊、行距,以及主題字型被解析成襯線/無襯線/等寬三類。表格有框線與表頭底色。約四十種圖形會用正確的幾何畫出來 —— 矩形、圓角矩形、橢圓與圓、三角形、菱形、平行四邊形、最多十二邊的多邊形、星形、箭頭、對話框與流程圖符號 —— 另外還有自訂路徑、旋轉、經主題解析的實心填色、線條顏色與寬度,以及 PNG 與 JPEG 圖片。投影片背景與母片裝飾圖元會畫出來。
圖表不轉換。圖表繪製器等於一個獨立的繪圖引擎 —— 座標軸、刻度、圖例、各種系列型別 —— 而一張只對一半的圖表比一塊空白更危險,因為它看起來像數據。SmartArt 是用 PowerPoint 存在檔案裡的後備圖畫出來的,形狀與文字會保留,但沒有它佈局引擎的細膩;如果檔案裡沒有那份後備圖,那一塊就是空白。漸層會變成所有色停的平均色。陰影、光暈、反射與 3D 效果不會輸出。動畫、換頁效果、內嵌影片與音訊在 PDF 裡本來就不存在,那是格式的性質不是這一頁的限制。DrawingML 規格裡其餘的圖形以矩形近似:位置對、顏色對、輪廓不對。
你一選檔就會知道哪幾項會影響你的簡報。這一頁會數你這一份檔案裡的圖表、SmartArt、漸層與不支援的圖形,量圖片與影音佔多少比例,然後把它找到的東西列出來 —— 幾毫秒之內,在任何轉換發生之前。
中文,以及我們會直接說不的那個情況
投影片上的中文需要在 PDF 裡嵌一份字型,因為 PDF 內建的字型只有拉丁字母。我們隨站帶一份 6,403 個字元的 Noto Sans TC 子集,只在你選了檔案、而且簡報需要時才抓,抓下來之後再依實際用到的字切一次子集才嵌進去。標題是這件事最明顯的地方,而一個印成問號的標題是最顯眼的一種失敗。
那種失敗教了我們不要相信保真度數字。有一份真實的日文簡報,文字留存率量出來 92.2%,對基準的墨水比是 1.677,兩個數字看起來都很好。那張投影片上印的是「????尾崎、淡??最期」—— 假名全部是問號。數字裡沒有任何一項說得出這件事,我們是打開渲染出來的圖看到的。
所以我們改成偵測它。日文與韓文會被拒絕,並且說明理由,而理由不是檔案大小。Noto Sans TC 裡一個諺文音節都沒有 —— 那 11,172 個字元不是「我們選擇不放」,是來源字型本身沒有 —— 而一句真實的韓文句子就算用完整的來源字型也只有 9.5% 畫得出來。日文的話,加了假名之後常見的日文專用漢字仍然只有 69.9%,所以頁面會只對一半,而只對一半比明確的拒絕更難解釋。加一點假名還會造成第二種傷害:我們的偵測器會停止對那些簡報發出警告,而輸出仍然是壞的。我們特別測過這個結果,那就是隨站字集停在這裡的原因。
沒有任何上傳,以及授權對你的 PDF 意味著什麼
你的簡報是用瀏覽器的檔案 API 讀進來的,在同一個分頁裡轉換,PDF 在記憶體裡組出來。沒有任何請求帶著你的簡報,所以沒有上傳可以被攔截、沒有保留政策需要你信任、也沒有一個可能被轉寄出去的下載連結。還沒公布的業績、內部策略、客戶名稱、薪資級距都住在簡報裡,而在本機做這件事的意義就是這些都不會送到我們這邊 —— 就算我們想看也看不到。
一分鐘就能驗:開發人員工具、網路分頁、轉一次檔案。你會看到這個頁面、它的程式碼,以及簡報需要時的那份中文字型。本站的 Content-Security-Policy 把連線限制在自己的來源,所以不論程式想做什麼,帶著你檔案的請求都會被瀏覽器擋掉。
隨站字型是 Noto Sans TC,授權 SIL Open Font License 1.1,授權全文隨檔案提供。該授權第 5 節末句寫明「必須維持在本授權下」的義務不延伸到使用本字型產生的文件,所以即使 PDF 裡嵌了字型子集,你的 PDF 本身不帶授權義務。有一件事我們不宣稱:這不是 PDF/A 輸出、也不是封存工具 —— 拉丁文字用的是 PDF 標準字型,而標準字型是不嵌入的,光這一點就已經讓檔案不符那個標準。
常見問題
我的版面配置與主題會轉過去嗎?
會。版面配置與母片的繼承都會解出來,包含主題色與主題字型、背景,以及母片上的裝飾圖元。這是一份真實簡報能不能正確轉出來最關鍵的因素 —— 我們八份真實測試檔裡有五份,在實作這件事之後從「幾乎沒有文字」變成完整。
有圖表的那張投影片為什麼那一塊是空的?
因為圖表不轉換。要正確畫出來等於實作一整套圖表引擎,而一張「差不多對」的圖表比一塊空白更容易誤導人 —— 它看起來還是像數據。這一頁會數你檔案裡的圖表數量,並在轉換前告訴你。
可以轉 .ppt 嗎?
不行。舊的 .ppt 是二進位複合檔,不是裝 XML 的 ZIP。請先用 PowerPoint、Google 簡報或 LibreOffice 開起來另存成 .pptx。
動畫與影片會保留嗎?
不會,而且沒有任何轉檔器留得住 —— PDF 是靜態文件。每張投影片會變成它最終狀態的一頁。
我的簡報會被上傳嗎?
不會。它在你的瀏覽器分頁裡被讀取與轉換。轉檔時打開開發人員工具的「網路」分頁:你的檔案不會出現在任何請求裡,而且本站的安全性政策也會擋掉這種請求。
為什麼日文簡報會被拒絕?
因為誠實的答案是我們畫不出來。隨站字型涵蓋的是繁體中文與拉丁文字。加了假名之後多數日文專用漢字仍然缺,會產出一頁只對一半的東西 —— 而且我們會因此停止警告你。所以我們選擇偵測到假名就直接說。