Spaces:
Sleeping
Sleeping
import gradio as gr | |
import tempfile | |
from pdf2image import convert_from_path | |
import fitz # PyMuPDF | |
def analyze_pdf(pdf_file): | |
results = [] | |
overall_rating = "OK" | |
with tempfile.TemporaryDirectory() as tmpdir: | |
# pdf2imageで画像を取得 | |
try: | |
images = convert_from_path(pdf_file.name, dpi=300, output_folder=tmpdir) | |
except Exception as e: | |
return f"PDF変換エラー: {str(e)}", "" | |
# 画像サイズ確認 | |
for i, img in enumerate(images): | |
width, height = img.size | |
page_rating = "OK" | |
if width < 1000 or height < 1000: | |
page_rating = "非推奨(解像度低)" | |
elif width < 1500 or height < 1500: | |
page_rating = "注意(やや低め)" | |
results.append( | |
f"ページ{i+1}: {width}x{height}px → {page_rating}" | |
) | |
if page_rating.startswith("非推奨"): | |
overall_rating = "非推奨" | |
elif page_rating.startswith("注意") and overall_rating == "OK": | |
overall_rating = "注意" | |
# 追加で、PDFメタ情報のDPIも参考に | |
doc = fitz.open(pdf_file.name) | |
dpi_infos = [] | |
for i, page in enumerate(doc): | |
try: | |
# MediaBoxや解像度情報から概算 | |
rect = page.rect | |
width_pt = rect.width | |
height_pt = rect.height | |
dpi_x = width / (width_pt / 72) | |
dpi_y = height / (height_pt / 72) | |
dpi_infos.append(f"ページ{i+1}推定DPI: {dpi_x:.1f}x{dpi_y:.1f}") | |
except Exception: | |
dpi_infos.append(f"ページ{i+1}推定DPI: 取得失敗") | |
# まとめ | |
result_text = "\n".join(results + [""] + dpi_infos) | |
result_text += f"\n\n総合評価: {overall_rating}" | |
return result_text, overall_rating | |
with gr.Blocks() as demo: | |
gr.Markdown("# Audiveris適性チェック(非公式・推定)") | |
gr.Markdown("PDFをアップロードすると、ページ画像サイズからAudiverisで使えそうかを推定します。") | |
with gr.Row(): | |
pdf_input = gr.File(label="PDFファイル") | |
analyze_button = gr.Button("判定") | |
result_output = gr.Textbox(label="詳細結果", lines=20) | |
rating_output = gr.Textbox(label="総合評価") | |
analyze_button.click(analyze_pdf, inputs=pdf_input, outputs=[result_output, rating_output]) | |
if __name__ == "__main__": | |
demo.launch() | |