HTMLviewer2_API / app.py
tomo2chin2's picture
Update app.py
f1bfdc2 verified
raw
history blame
2.92 kB
import gradio as gr
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
from io import BytesIO
import tempfile
import time
import os
def render_fullpage_screenshot(html_code):
# HTMLコードを一時ファイルに保存
tmp_file = tempfile.NamedTemporaryFile(suffix=".html", delete=False)
tmp_path = tmp_file.name
tmp_file.write(html_code.encode('utf-8'))
tmp_file.close()
# ヘッドレスChrome起動オプション
options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--force-device-scale-factor=1")
try:
driver = webdriver.Chrome(options=options)
# まずは適当なウィンドウサイズでページを読み込む
driver.set_window_size(1200, 800)
driver.get("file://" + tmp_path)
# ページロード完了を待つ
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
# フォントや外部リソース読み込みの安定化のため少し待機
time.sleep(2)
# スクロールバーを非表示にする(必要に応じてコメントアウト)
driver.execute_script("""
document.documentElement.style.overflow = 'hidden';
document.body.style.overflow = 'hidden';
""")
# ページ全体の幅・高さを取得
scroll_width = driver.execute_script("return document.body.scrollWidth")
scroll_height = driver.execute_script("return document.body.scrollHeight")
# ウィンドウサイズをページ全体の幅・高さに再設定
driver.set_window_size(scroll_width, scroll_height)
# レイアウト変化を待つ
time.sleep(2)
# ページ全体をスクリーンショット
png = driver.get_screenshot_as_png()
except Exception as e:
# 何らかのエラー時は1x1の黒画像を返す
return Image.new('RGB', (1, 1), color=(0, 0, 0))
finally:
driver.quit()
if os.path.exists(tmp_path):
os.remove(tmp_path)
return Image.open(BytesIO(png))
# Gradioインターフェース
iface = gr.Interface(
fn=render_fullpage_screenshot,
inputs=gr.Textbox(lines=15, label="HTMLコード入力"),
outputs=gr.Image(type="pil", label="ページ全体のスクリーンショット"),
title="Full Page Screenshot App",
description="HTMLをヘッドレスブラウザでレンダリングし、ページ全体を1枚の画像として取得します。"
)
if __name__ == "__main__":
iface.launch()