可以參考此篇實作
用VUE3做个PDF动态合同表单(含编辑+渲染)
https://juejin.cn/post/7379995743883624485
我不知道有沒有 vue3 可以直接套用的
昨天看到這問題後嘗試了一下
有找到在瀏覽器編輯後把資料送到後端的方法
(以下只是研究「做不做得到」的過程,所以直接改 build 好的東西,如果要用自己再進一步看相關文件吧)
我用的是 PDF.js
這是 FireFox 開啟 pdf 使用的程式碼
我在那網站下載 Prebuilt (modern browsers) 版本:
https://github.com/mozilla/pdf.js/releases/download/v4.9.124/pdfjs-4.9.124-dist.zip
解壓縮放到伺服器環境後,他的 web/viewer.html 可以直接打開
會顯示一個示範的 pdf
接著我去修改 web/viewer.mjs 的程式碼
在 4364 行是一個 download 方法
裡面的 if(data)
內容我改成這樣
if (data) {
let file = new File([data], filename, {type: 'application/pdf'});
let formData = new FormData();
formData.append('file2save', file);
fetch('save-pdf.php', {
method: 'post',
body: formData
}).then(r => r.text())
.then(text => console.log(text));
}
如此一來,當使用者按下儲存檔案按鈕,就會把修改後的 pdf 資料送到後端
而上述方法,只要 FireFox 本身能修改 pdf 的功能,應該都有支援
我目前開發過的專案有用 vue3 (vite 建置) 搭配 pdfjs(pdfjs-dist) 來針對前端呈現 PDF 檔案,然後再根據前端 vue UI(HTML/JS/CSS) 的方式來處理 呈現+編輯功能(非編輯實際 PDF 檔案) ,之後再透過 回傳編輯資料的 json (資料+位置),在後端(java Spring 後台)用另外可處理 PDF 檔案的元件將這些重新寫入到PDF檔案中!
就我所知 前端目前 pdfjs(pdfjs-dist)以檢視功能為主,透過 canvas / img 的方式一頁一頁呈現指定的 PDF 內容,至於目前官網比較新的版本提供的 editor 功能看起來也不是在前端直接編輯 PDF 檔案(若有錯誤請更正)!
此外我沒用過 pdf-lib.js ,但查詢了一下根據這篇的說明 "PDF處理庫"NPM套件對比 https://npm-compare.com/zh-TW/pdf-lib,pdf-parse,pdfjs-dist
看起來是可以在前端(Browser) 中編修 PDF 檔案,可能需要嘗試才會知道如何使用!
不過我會認為[前端直接回傳 PDF] 的資安風險(惡意PDF上傳) ,比僅透過 [傳回資料並由後端再編輯處理PDF 後產生] 來的高,這個可能需要謹慎考慮!
pdfjs-dist(也就是 PDF.js)是直接編輯 PDF 喔
雖然只有簡單的功能
像是加文字在某些地方、畫線或螢光筆
也可以填寫 PDF 表單
是的,我又查了一下官方範例,官方展示: https://mozilla.github.io/pdf.js/web/viewer.html
看起來是可以編輯後存檔,不回傳server ,而是直接用 js 把異動檔案轉為 download 方式存檔, 這個方式就不會有上傳 PDF的資安問題!
相關資料: viewer.html : https://github.com/mozilla/pdf.js/blob/master/web/viewer.html
pdf.js/web/app.js : https://github.com/mozilla/pdf.js/blob/master/web/app.js#L1109
**pdf.js/src/display/api.js : ** https://github.com/mozilla/pdf.js/blob/master/src/display/api.js#L2966