2021/12/16

JS / 將網頁轉換成PDF

將網頁轉換成PDF的方法很多種

比較常見且最簡單的方式就是直接使用列印功能

在印表機選擇”另存成PDF”

不過我還是想嘗試能不能用JavaScript的方式來輸出

在網路找了很多教學文章

大致可以分為兩種方式

1.使用名稱為 jsPDF的函式庫

但是這個函式庫比較適合”無中生有”的方式來”產生”PDF

Demo的網頁就可以看出來,可以透過函式庫的不同方法(method)來產生PDF

然而想要將現成的網頁轉成PDF時,無論是直接使用addHTML輸出網頁內容

還是使用html2canvas,將網頁先輸出成canvas再轉換成PDF

兩種方式產生的PDF內容都會變形或者有缺漏

比較好的方式是搭配另一個函式庫 rasterizehtml 

先處理html,然後透過jsPDF輸出成canvas,再轉成PDF

 

2.利用windows物件的功能

將想要輸出的頁面寫入一個新的視窗,執行列印,在印表機選擇”另存成PDF”

或者其他PDF模擬印表機的功能

這個方式的輸出效果應該是最好,只是流程上還是會有需要手動執行

不能按一個鈕,然後直接產生PDF

也或許可能,後續可以再研究研究

 
 

需要注意的地方是不管是方法1.還是方法2

頁面的CSS都要寫在輸出頁面的區塊內

這樣才能將CSS效果一起輸出

如果使用jsPDF的話,需要注意版本的問題

1.X版的物件宣告跟2.X版的不一樣

1.X版是   .jsPDF

2.X版則是   .jspdf.jsPDF

應該也有功能細部上的差異,但是我只是用到轉換的功能

所以沒有感覺有太大的差別

2021/12/01

App / 使用App Inventor 製作取得運動中心容留人數的APP (2024/2/24 修改)

2024/2/24 修改

1. Fetch 網址改變,如果用瀏覽器開啟會自動轉址,但是App Inventor沒有可以設定的地方(或者是我沒找到)

新的網址:https://www.tpejjsports.com.tw/index.php/zh-TW/frontend/onsitenum

2.寫出資料到index.html(可省略)的「寫出網頁資料」程序

似乎因為Android安全性的問題,檔案無法直接存在手機,但是可以寫入外部記憶卡

在模擬器測試時是沒有問題

不過我的手機沒有插卡,所以把 index.html上傳到網頁空間

VBA / 抓取網路 JSON資料 版本2

VBA / 抓取網路 JSON資料透過資料分割的分是取得JSON資料

Gg / App 從Google Spreadsheets建立查詢ISBN的AppSheet APP 版本2

提到彰化一整天對於Html的處理方式只用了javascript內建函式

設計成2個外部程序來處理字串分割

而在VBA裡對於JSON資料的處理也同樣是字串分割

因此,嘗試將原有的VBA程式碼中字串分割的程序修改為呼叫外部Function處理

原來的Sub中進行資料分割的程式碼,是利用InStr()找特定字串出現的第一個字元的位置

再用Mid()取出範圍內的字串

 '處理抓回來的資料  要依據實際資料進行調整
            
            startVal = InStr(1, S, """" & "records" & """", vbTextCompare) ' "records"
            startVal = InStr(startVal, S, "[", vbTextCompare)  '[
            endVal = InStr(startVal, S, "]", vbTextCompare)    ']
            strDiv = Mid(S, startVal, (endVal - startVal) + 1) '從"records" 後取出[{...}]

 

改寫成Function

 VBA的Sub 跟 Function 最大的差別是 Function會有回傳值,所以也可以自訂函數在工作表中使用

'取得資料範圍
'Function 會有回傳值

Function Div(S As String, H As String) As String
    
    startVal = InStr(1, S, """" & H & """", vbTextCompare) ' "records"
    startVal = InStr(startVal, S, "[", vbTextCompare)  '[
    endVal = InStr(startVal, S, "]", vbTextCompare)    ']
    
    Div = Mid(S, startVal, (endVal - startVal) + 1) '從"records" 後取出[{...}]

End Function

 

回傳的形式是 Function名稱=回傳內容

相當於javascript 的return 回傳內容

需要筆記的部分還有

雖然VBA沒有強制設定變數資料型態,但是如果要將變數傳入Function時

就必須要設定資料型態

而Function的參數與回傳值也同樣要設定資料型態,這樣才不會產生錯誤

原來Sub程式碼改成呼叫Function的形式

Dim S As String  '傳入function時必須精確設定資料類型 
S = xmlHttp.ResponseText                         '回傳資料內容
 ...   
 ...  
            Dim H As String
            H = "records"
            
            strDiv = Div(S, H)  '將資料傳入Function Div處理

 

參考資料

EXCEL VBA 函數(Function)與副程式(Sub)