# pdf加字 ###### tags: `程式設計` `itextsharp` `ghostscript` `js` ## 需求與想解決的問題 電子票券、報名表之類的東西,常常都是用一個固定的版面,並且在某些格子上寫姓名電話序號之類的字,讓使用者下載即可。 但是**用程式調版面**這件事很麻煩,常常使用者到最後一刻才給個word檔,調整的過程使用者又說版面要調整,導致前面都在做白工,最後只能逼使用者不准修改直接上,或是一拖再拖的延期,結果大家都不開心。 ## 預計解決方式 如果能把生成pdf這個工作拆出去,讓提出需求的人自己先把pdf版型做好,程式人員只負責資料處理,把該換掉的字補上去,就會輕鬆許多。 利用 **itextsharp** ,可以針對pdf進行處理,將現有pdf上加字加圖,甚至增加新的pdf頁面和葉面上的內容。 所以其實可以全部用itextsharp動態生成pdf,但是我們的目的就是希望不要把所有loading都壓在程式開發人員身上,因此排pdf這件事不會在這邊討論 ## itextsharp處理流程 itextsharp是專門來處理pdf的,使用流程如下 1. 讀取現有的pdf檔 2. 取得要加上去的關鍵字 3. 指定好關鍵字的屬性,包含 x y 軸、字體、尺寸、字型、色彩並寫上pdf 4. 儲存pdf ## 前端介面 雖然有了上面的程式,但還是得在程式裡手動去設定xy軸,如果沒有圖形介面可以看的話其實也不知道要加在哪,只能反覆生成又刪除,不太好用,理想情況下是有js可以顯示預覽的pdf,並且標記關鍵字要出現在pdf的什麼位置,不過pdf本身沒辦法直接跟網頁元素疊在一起,因此預計使用ghostscript,把pdf轉成圖片檔,再利用js去決定關鍵字要疊在什麼地方。 其實網路上也有討論可以用Imagemagick這套來轉檔,不過用這個還是得裝ghostscript才能轉pdf,那乾脆直接用ghostscript來轉就好,還可以少裝一套軟體。 ## GhostScript轉檔 gswin32c.exe -dNOPAUSE -sDEVICE=jpeg -r200 -dJPEGQ=60 -sOutputFile=pdf.jpg pdf.pdf -dBATCH ghostscript取得pdf並轉成圖片 ## 前端流程 1. 將ghostscript轉好的圖片輸出到html上 2. 讓使用者點選圖片的多個位置,並取得該點的x,y軸記錄下來 3. 存起來,輸出到後端後讓itextsharp寫進pdf 4. 吐出pdf的下載點,讓使用者下載回去 (如果有多個pdf,可能考慮用zip檔壓縮 ## 元件下載 itextsharp https://sourceforge.net/projects/itextsharp/ GhostScript Portable https://portableapps.com/apps/utilities/ghostscript_portable ## 參考文獻 Imagemagick Convert PDF to JPEG: FailedToExecuteCommand `“gswin32c.exe” / PDFDelegateFailed https://stackoverflow.com/a/36137513 https://stackoverflow.com/questions/1941118/converting-pdf-to-a-collection-of-images-on-the-server-using-ghostscript