確實難度很大
PDF是基于PostScript子集渲染的,PostScript是一門圖靈完備的語言
而Word能實現的,實際上又是PDF能力的子集(不考慮各種插件的話),而且很巧的是Word是版式編輯轉PDF連排版都不用管
子集向父集轉換是很容易的,因為只要一一映射就行了,把所有Word支持的東西逐一映射過去就完事了
但反過來父集轉子集就不好辦了,子集里有的能力可以一一映射,沒有的能力就需要額外處理workaround
就比如PDF支持非常復雜的陰影信息,但是Word沒有這么復雜的矢量圖和陰影混合繪制的支持,那怎么辦,那就得把陰影也處理成矢量圖,還要進行元素合并,因為PDF的元素單位可以小到一條線,但Word處理不了那么高精度的矢量元素疊加。更不要說PDF復雜的色彩管理和十幾種字體格式甚至允許同名的不同字體和諧存在于一個文件中了(PDF中的字體引用都是DictionaryObject,不涉及名稱,記錄字體名稱純屬參考用罷了,你刪掉或更改字體名稱不影響頁面渲染效果)
同樣類似的,Word因為是版式編輯框架下的流式排版,所以去除版式約束的Web編輯模式實際上又是HTML的子集,所以Word可以完美轉HTML,但HTML反過來轉Word一大堆無法實現的特性就也會一團糟
而反過來,沒有HTML標簽的Markdown又是Word的子集,所以Markdown轉Word是成熟的不能再成熟的東西了
當然你硬要說直接轉成一張圖片塞進去就算了那也不是不行,但那和直接一個img標簽把美工做的圖丟進去跟美工說我把頁面做好了有什么區別?
這時候可能有人就會問了,為什么有的程序生成的PDF再用這個程序打開可以完全還原呢?其實原理很簡單
PDF實在是太自由了,你甚至可以插入一個自定義的Dictionary Object,然后把原始文件流直接寫進去
然后讀取PDF的時候檢測到之前寫的原始文件流就讀出來就和讀原來的文件一點區別都沒有