利用PowerShell自動擷取螢幕畫面拍下電子書

利用PowerShell自動擷取螢幕畫面拍下電子書

我覺得既然做電子書,卻還有著跟實體書一樣的限制,甚至更不方便,那就失去了電子書的意義了。 下面的程式碼利用擷取螢幕的方式將書籍拍下來。

  • 先選轉螢幕方向及調整適合的縮放比例。
  • 執行PowerShell小程式,如果無法用系統管理員身分執行PowerShell(才能執行儲存後的ps1檔),就直接開啟PowerShell ISE,並把程式碼貼上並修改執行(這個腳本檔不要存檔)。
  • 有時候換頁太快頁面來不及讀取會模糊掉。或是有時候udn讀書館本身讀取就有問題,就是某頁會模糊,等多久都還是模糊的,這時候要重新讀取整本電子書來解決。有時候瀏覽器的記憶體會用光,導致頁面無法讀取,建議分批擷取,也就是一次擷取一百頁就好。
  • 檢查擷取下來的圖檔,哪些頁面是模糊的,再獨立擷取該頁面。(一樣用剛剛的PowerShell腳本檔,改$total跟$pages再執行就好。)
  • 將擷取下來的圖檔合併成PDF檔,如果沒有Adobe Acrobat或是無法合併的話,頁數少的話可以用線上的jpg轉pdf並合併的工具,頁數多的話可以用這個PowerShell的腳本轉存成bmp(路徑要改,將其中的兩個png改成bmp),使用這個腳本的時候要注意,不同位數的圖檔要分開放,否則命名會錯亂,也就是說,1~9,10~99,100~999要分開放。(如果有些頁面是黑底白字,可以用小畫家的顏色反轉將文字顏色換過來。
  • 最後,用Adobe Acrobat切割頁面。
$total = 1 # 儲存圖檔計數器

$pages = 100 # 要擷取的頁數 

# 讓系統取得title叫做[Chrome]的視窗
# 並讓該視窗變成當前視窗
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('Chrome')
Sleep 1

for($r=1; $r -le $pages; ++$r)
{
        # 擷取畫面
        [Reflection.Assembly]::LoadWithPartialName("System.Drawing")
        function screenshot([Drawing.Rectangle]$bounds, $path) 
        {
            $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
            $graphics = [Drawing.Graphics]::FromImage($bmp)    
            $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
            $bmp.Save($path)
            $graphics.Dispose()
            $bmp.Dispose()
        }
        
        # 擷取範圍,建議可以設大一點,之後再用Acrobat Adobe裁切頁面多餘的部分
        $bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1060, 1750)
        
        # 將擷取的畫面存檔。
        # 請將存檔路徑設在桌面或是下載資料夾,
        # C槽或是其他系統資料夾存檔時需要詢問權限,會造成存檔失敗。
        # 注意到會覆蓋原本同名的檔案(不會警告)。
        screenshot $bounds "C:\Users\math2\Downloads\$total.jpg"
        ++$total
        Sleep 1

        # 下一頁,秒數越多,給網頁讀取的時間越充裕,當然速度越慢,但模糊頁面的機會越少
        $wshell.SendKeys('{RIGHT}'); Sleep 10
}

No comments:

Post a Comment