質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1270閲覧

Google ColaboratoryでChrome Devtools Protocolを使って、ウェブページのBase64形式のpdfデータを取得し、文字化け無くPDF化し保存したい

mii8tama

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/02/02 15:29

編集2023/02/02 19:02

実現したいこと

  • Google ColaboratoryでChrome Devtools Protocolを使って、ウェブページのBase64形式のpdfデータを取得し、文字化け無くPDF化し保存したい

前提

下記ウェブサイト参考にし、ページをPDF保存するプログラムを作成しています。
https://qiita.com/mochi_yu2/items/a845e52b8aa677f132bf

この方法では、Chrome DevTools Protocolを活用して、Seleniumで表示したページをPDFに保存しています。

発生している問題

  • 保存後のPDFが文字化けしている

JupyterLabでは文字化け無くPDF保存できたのですが、Google Colaboratoryで実行したところPDFが文字化けしてしまいます。

Chrome Devtools Protocolコマンドを実行した際に取得できるBase64形式のPDFデータのデコードが上手くできていないのか、PDFは文字化けしてしまいます。

追記
JupyterLabとGoogle Colaboratoryで、取得できるデコード前のBase64形式のPDFデータが少し異なりました。
デコード前のそれぞれのデータを以下のサイトでPDF化したところ、JupyterLabでは文字化けは無く、Google Colaboratoryの方では文字化けしていました。
https://base64.guru/converter/decode/pdf

Google Colaboratoryの方では、Base64形式のPDFデータが正しく取得できていないのでしょうか?
解決方法等あれば、ご教授お願いいたします。

以下がJupyterLabとGoogle Colaboratoryで実行したプログラムです。

Jupyter Labのソースコード

python

1import pandas as pd 2from selenium import webdriver 3from selenium.webdriver.support.ui import WebDriverWait 4from selenium.webdriver.chrome.service import Service as ChromeService 5from webdriver_manager.chrome import ChromeDriverManager 6from selenium.webdriver.chrome.options import Options 7import time 8import os 9import base64 10 11def save_to_pdf(driver, file_path): 12 parameters = { 13 "printBackground": True, # 背景画像を印刷 14 "paperWidth": 8.27, # A4用紙の横 210mmをインチで指定 15 "paperHeight": 11.69, # A4用紙の縦 297mmをインチで指定 16 # "displayHeaderFooter": True, # 印刷時のヘッダー、フッターを表示 17 } 18 # Chrome Devtools Protocolコマンドを実行し、取得できるBase64形式のPDFデータをデコードしてファイルに保存 19 pdf_base64 = driver.execute_cdp_cmd("Page.printToPDF", parameters) 20 #print(pdf_base64) 21 pdf = base64.b64decode(pdf_base64["data"]) 22 with open(file_path, 'bw') as f: 23 f.write(pdf) 24 25# URLリスト取得 26urls = [] 27with open('urls.txt', mode='rt', encoding='utf-8') as f: 28 urls = f.readlines() 29 30# Chrome options 31options = webdriver.ChromeOptions() 32options.add_argument('--headless') 33options.add_argument('--no-sandbox') 34options.add_argument('--disable-gpu') 35 36driver = webdriver.Chrome("./chromedriver.exe", options=options) 37for i, url in enumerate(urls,1): 38 driver.get(url) 39 save_to_pdf(driver, str(i) + '.pdf') 40 41driver.close() 42driver.quit()

Google Colabratoryのソースコード

Google Colabratoryでは、webdriverが起動できなかったので、最初に以下のサイトのこのコードを実行しました。
https://teratail.com/questions/9wfzcz4dxd22m1

shell

1%%shell 2# Ubuntu no longer distributes chromium-browser outside of snap 3# 4# Proposed solution: https://askubuntu.com/questions/1204571/how-to-install-chromium-without-snap 5 6# Add debian buster 7cat > /etc/apt/sources.list.d/debian.list <<'EOF' 8deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main 9deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main 10deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main 11EOF 12 13# Add keys 14apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517 15apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138 16apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A 17 18apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg 19apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg 20apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg 21 22# Prefer debian repo for chromium* packages only 23# Note the double-blank lines between entries 24cat > /etc/apt/preferences.d/chromium.pref << 'EOF' 25Package: * 26Pin: release a=eoan 27Pin-Priority: 500 28 29 30Package: * 31Pin: origin "deb.debian.org" 32Pin-Priority: 300 33 34 35Package: chromium* 36Pin: origin "deb.debian.org" 37Pin-Priority: 700 38EOF 39 40# Install chromium and chromium-driver 41apt-get update 42apt-get install chromium chromium-driver 43 44# Install selenium 45pip install selenium

python

1import pandas as pd 2from selenium import webdriver 3from selenium.webdriver.support.ui import WebDriverWait 4from selenium.webdriver.chrome.service import Service as ChromeService 5from webdriver_manager.chrome import ChromeDriverManager 6from selenium.webdriver.chrome.options import Options 7import time 8import os 9import base64 10 11def save_to_pdf(driver, file_path): 12 parameters = { 13 "printBackground": True, # 背景画像を印刷 14 "paperWidth": 8.27, # A4用紙の横 210mmをインチで指定 15 "paperHeight": 11.69, # A4用紙の縦 297mmをインチで指定 16 # "displayHeaderFooter": True, # 印刷時のヘッダー、フッターを表示 17 } 18 # Chrome Devtools Protocolコマンドを実行し、取得できるBase64形式のPDFデータをデコードしてファイルに保存 19 pdf_base64 = driver.execute_cdp_cmd("Page.printToPDF", parameters) 20 # print(pdf_base64) 21 pdf = base64.b64decode(pdf_base64["data"]) 22 with open(file_path, 'bw') as f: 23 f.write(pdf) 24 25# URLリスト取得 26urls = [] 27with open('urls.txt', mode='rt', encoding='utf-8') as f: 28 urls = f.readlines() 29 30# Chrome options 31options = webdriver.ChromeOptions() 32options.add_argument('--headless') 33options.add_argument('--no-sandbox') 34options.add_argument('--disable-gpu') 35 36driver = webdriver.Chrome(service=ChromeService("/usr/bin/chromedriver"),options=options) 37# driver = webdriver.Chrome( 38# executable_path=ChromeDriverManager().install(), 39# options=options 40# ) 41 42for i, url in enumerate(urls,1): 43 driver.get(url) 44 save_to_pdf(driver, str(i) + '.pdf') 45 46driver.close() 47driver.quit() 48

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

私と同じ問題を質問している方を発見し、この方法で解決することができました。
https://teratail.com/questions/bqti1p61c26ina

私の場合、コードを以下のように変更しました。

shell

1apt-get install chromium chromium-driver

shell

1apt-get install chromium chromium-driver fonts-noto

webdriverをインストールする際に日本語フォントもインストールしないといけませんでした。

投稿2023/02/02 21:11

mii8tama

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問