Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

PDFの保護解除を自動化!(Selenium + Google Chrome)

投稿日:







「name.pdf(保護)」のように読み取り専用のpdfは、文章にマーカーが引けず
後で参照したいときに非常に苦労します。特にiPadでpdfを読む最大のメリットは、pdfに直接手書きの
メモが書けることだと思います。

そこで、GoogleChromeのpdf保存オプションでpdfの保護を解除できることを利用して
複数のpdfの保護解除をSeleniumで自動化することにしました。

ちなみにバージョンは以下の通りです。
Selenium: 3.141.0
Chrome driver:84.0.4147.30.0
Chrome:84.0.4147.105
Python: 3.7.6 (Anaconda)

スポンサーリンク

Pythonコード

pdfPathを指定するだけでpdfPathの下にboxという名前のファイルを作り、その中に保護解除されたpdfが入ります。
time.sleepの時間はお好みで設定してください(5秒だと少し遅いです)

#!/usr/bin/env python3

#必要なものをインポート
import os
import json
import glob
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#Anacondaでchromedriverを使っている人は必須
import chromedriver_binary

#pdfPathは保護がついたpdfが入っているパス
#savePathは保護解除したpdfが入るパス
pdfPath = r'C:\Users\username\protected-pdf'
savePath = pdfPath + r'\box'

#savePathをつくる
os.makedirs(savePath, exist_ok=True)

#pdfの拡張子がついたものだけ取り出す
globPath = pdfPath + r'\*.pdf'
pdf_list = glob.glob(globPath)

#取り出したpdfの数
nlist = len(pdf_list)

#保護解除をしてsavePathに保存する処理
def remove_readonly(ipdf):

    #pdfのファイルパスを指定してchromeを起動
    driver.get(pdf_list[ipdf])

    #pdfのすべての要素が完全に読み込むまで待機する処理(いらないかも?)
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.visibility_of_all_elements_located)

    #必須の待機処理(注意点を参照)
    time.sleep(5)

    #chromeでpdfを生成する
    driver.execute_script('return window.print()')

#必須の待機処理(注意点を参照)
    time.sleep(5)


#複数のファイルでremove_readonlyを行う
def main(pdf_list):

    for ipdf in range(nlist):

        print(pdf_list[ipdf])
        remove_readonly(ipdf)

#ループが終わったらウインドウを閉じる
    driver.close()


#印刷のオプションを設定
chrome_options = webdriver.ChromeOptions()

#設定をJSで記載("account"は空欄のままでよい)
appState = {
                "recentDestinations": [
                    {
                        "account": "",
                        "id": "Save as PDF",
                        "origin": "local"
                    }
                ],
                "selectedDestinationId": "Save as PDF",
                "version": 2
                }

#保存先はここで指定
profile = {'printing.print_preview_sticky_settings.appState':json.dumps(appState),'savefile.default_directory':savePath}

chrome_options.add_experimental_option('prefs', profile)
chrome_options.add_argument('--kiosk-printing')
driver = webdriver.Chrome(options=chrome_options)


if __name__ == '__main__':
    main(pdf_list)

待機条件の注意点

一連のコードで重要なポイントは「time.sleep(5)」です!
以下のように「return window.print()」の前後に待機条件をいれないと、最初または最後に指定したpdfだけが印刷されてしまいます。
本来であれば、seleniumのwait条件で印刷における待機条件を設定するのですが、
上手く機能しなかったのでtime.sleepで代用しました。

time.sleep(5)
  driver.execute_script('return window.print()')
  time.sleep(5)

pdf作成の注意点

pdfを生成するコードは他にもあります。
例えば、以下のようにプラグインを有効にしてpdfを生成する方法があります。
確かにこの方法でpdfを生成できますが、保護が解除されません・・・・

chrome_options.add_experimental_option("prefs", {
          "download.default_directory": savePath,
          "plugins.always_open_pdf_externally": True
      })
chrome_options.add_argument('--kiosk-printing')

参考にしたサイト様

・chromeでpdf保存をするやり方
https://qiita.com/cozy16/items/9448203691e206072558
https://stackoverflow.com/questions/49642896/automate-print-save-web-page-as-pdf-in-chrome-python-3-6

・注意点で取り上げたpdf生成方法
https://qiita.com/memakura/items/f80d2e2c59514cfc14c9

・chromedriverのインストールとパスの通し方
https://watlab-blog.com/2019/08/10/chromedriver-path/


-Python
-, , ,

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.