在PDF裡面藏JavsScript
有天我有個想法,想在PDF裡面以壓縮後的編碼儲存文件,點開時再解壓縮,這時候就會用到Embedded js(嵌入式JavaScript),而這裡的JavaScript和一般網頁開發的JavaScript不太一樣,這裡的JavaScript沒有那麼多花裡胡哨的Function可以使用,可以用的函式還會依照各個瀏覽器而定。
Adobe Acrobat
這是最支援JavaScript的PDF瀏覽器之一,但很可惜它不支援Linux,他的文件相對好懂,但是基於安全性設定,很多酷酷的功能會被限制住。 文件
Okular
KDE系統預設的軟體,和Adobe Acrobat差不多好用,還不用錢,但是對JavaScript的支援相對沒有Adobe多,找Function的話可以直接去Github的原始碼抓,只有一些很基本的功能。 原始碼 JSUtil Class
痛點
支援函式數量
Embedded JS的支援真的少,大部分可以直接用的函式都是和PDF文件操作有關,其他像是Base64 encode/decode、壓縮解壓縮都要自己手刻,會讓程式碼長度不小,而且維護不易。
安全性限制
由於Embedded JS可以操作的空間太多了,甚至可以在點開的時候不經使用者確認就執行,因此現代瀏覽器就會相對給予限制,甚至很多合法的用途也會被NotAllowedError擋下來,因此可用性就大幅降低。
舉例來說當你要實做一個點開就會自行解壓縮的PDF時,Adobe的app.openDoc就限制不能在doc open的時候執行,否則會跳出NotAllowedError1。
支援性不高
因為安全性考量,現在仍然有很多瀏覽器即使能開啟PDF仍不支援Embedded JS,因此在嵌入時應考量使用受種使用瀏覽器種類並考量無JavaScript時的使用情境。
但真的想藏JavaScritp怎麼藏?
由於我沒有使用Adobe Reader,所以透過Adobe的方式可以參考其他人的教程。
不使用Adobe的話光靠一般的Word似乎沒辦法藏,於是我推薦使用pypdf這個函式庫,可以透過以下方法安裝:
pip install pypdf
一個簡單doc open的跳出的程式範例:
from pypdf import PdfWriter
writer = PdfWriter()
writer.add_blank_page(width=612, height=792)
writer.add_js("app.alert('Hello world!');")
with open("output.pdf", "wb") as f:
writer.write(f)