PythonのSeleniumでhtmlをpdfにするときの設定メモ

Python

htmlファイルをpdfに変換する必要が生じたので、どうやってやろうかといろいろ調べた結果、最終的に使ったのはSeleniumだった。今回少し調べ物をしてまた忘れそうなので、メモしておく。

Google先生に聞くと、下記の記事が日本語だと見つかる。(いつも思うのだがPDF関連は日本語の記事が多い気がする)

上記のように猫も杓子もWebサイトを自動でPDFに変換していて、これだけだと何もメモすることない。今回よくわからなかったのは、PDFに印刷する際の詳細設定。具体的にいえば、ヘッダーフッターの設定など、PDFに保存する際に設定する項目がわからなかった。たとえば、上記のWebサイトを参考にすると、下記のコードで阿部寛のホームページをPDFで保存できる。


import json
import os
from selenium import webdriver


options = webdriver.ChromeOptions()
appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account":""
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
options.add_experimental_option('prefs', prefs)
options.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=options)
driver.get("http://abehiroshi.la.coocan.jp/")
driver.execute_script('return window.print()')

ここで例えば、下記がやりたかったらどうするか。

  • ヘッダーフッターを消したい、もしくはつけたい
  • 横向きに印刷したい
  • 紙のサイズを変えたい

chromedriverに渡すオプションのjsonのどこかに指定するんだろうけど何を書けばいいかよくわからないなと思ってchromedriverの公式ドキュメントを読んだ。そうしたらCapabilitiesのひとつとして設定できることが分かった。具体的なパラメタはGoogle ChromeのPreferences (WindowsだとC:\Users\your_name\AppData\Local\Google\Chrome\User Data\Default\Preferencesに入っている)を見ればわかる。Preferencesファイルはjsonみたいなファイルになっており、わかりやすいパラメタ名がついている。たとえば、Preferencesを見ながら、下記を変えた。

  • ヘッダーフッターを消した
  • 紙を横長にした
  • 保存先をDownloadsではなくDocumentsに変更した

import json
import os
from selenium import webdriver


options = webdriver.ChromeOptions()
appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account": "",
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2,
    "isHeaderFooterEnabled": False,
    "isLandscapeEnabled": True
}

prefs = {'printing.print_preview_sticky_settings.appState':
         json.dumps(appState),
         "savefile.default_directory": "C:\\Users\\your_name\\Documents"
         }
options.add_experimental_option('prefs', prefs)
options.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=options)
driver.get("http://abehiroshi.la.coocan.jp/")
driver.execute_script('return window.print()')

満足した。しかし、よく考えてみると、chromedriverが立ち上がったあとで手動で上記の設定を変えても、うまくいったのかも。

コメント