メタデータテーブルとその内容をMDにした子テーブルを作成した。
Open WebUIに食わすには、メタデータ付きMDにすべきらしく、
GEMINIちゃんに案を出してもらった。
exportmd.py
import os
import sqlcipher3 as sqlcipher
from dotenv import load_dotenv
def init_db(db_path):
OUTPUT_DIR = "meta_combined_md" # 出力先フォルダ名
os.makedirs(OUTPUT_DIR, exist_ok=True)
load_dotenv("/workspaces/envDBPwdDir/.env") # .env を直接読む
PASSWORD = os.getenv("DB_PASSWORD")
conn = sqlcipher.connect(db_path)
cursor = conn.cursor()
# 暗号化キー
cursor.execute(f"PRAGMA key = '{PASSWORD}';")
cursor = conn.cursor()
# --- SQLクエリ(pdf_chunks と pdf_info を結合) ---
query = """
SELECT
p.file_name,
p.file_path,
p.title,
p.author,
p.subject,
p.keywords,
p.page_count,
p.scanned_at,
c.chunk_index,
c.section_title,
c.content
FROM
pdf_chunks c
JOIN
pdf_meta p ON c.parent_id = p.id;
"""
try:
cursor.execute(query)
rows = cursor.fetchall()
print(f"データベースから {len(rows)} 件のチャンクを取得しました。処理を開始します...")
for row in rows:
(file_name, file_path, title, author, subject,
keywords, page_count, scanned_at, chunk_index,
section_title, content) = row
# 特殊文字などによるファイル名エラーを防ぐため、元のファイル名から拡張子を除いてベース名を作成
base_name = os.path.splitext(file_name)[0]
# ファイル名が重複しないよう「元ファイル名_チャンク番号.md」にする
md_filename = f"{base_name}_{chunk_index}.md"
md_filepath = os.path.join(OUTPUT_DIR, md_filename)
# None(空のデータ)が入っていた場合にテキストとして綺麗に表示するための変換処理
meta_title = title if title else "未設定"
meta_author = author if author else "不明"
meta_subject = subject if subject else "なし"
meta_keywords = keywords if keywords else "なし"
meta_section = section_title if section_title else "(セクション名なし)"
# Markdownの作成(先頭にYAML Front Matter形式でメタデータを埋め込む)
md_content = f"""---
file_name: "{file_name}"
file_path: "{file_path}"
pdf_title: "{meta_title}"
author: "{meta_author}"
subject: "{meta_subject}"
keywords: "{meta_keywords}"
total_pages: {page_count if page_count else 0}
scanned_at: "{scanned_at}"
chunk_index: {chunk_index}
section_title: "{meta_section}"
---
# {meta_section}
{content}
"""
# ファイルへ書き込み
with open(md_filepath, "w", encoding="utf-8") as f:
f.write(md_content)
print("\n成功しました!")
print(f"'{OUTPUT_DIR}' フォルダの中にメタデータが合体したMarkdownファイルが生成されました。")
print("このフォルダ内のファイルをすべて Open WebUI にドロップしてください。")
except sqlcipher.Error as e:
print(f"SQLエラーが発生しました: {e}")
print("※親テーブル名やカラム名がデータベースと完全に一致しているかご確認ください。")
finally:
conn.close()
# --- 実行 ---
if __name__ == "__main__":
# お手元の環境のフォルダパスに書き換えてください
target_folder = "../pdfs"
init_db(db_path="pdf_info.db")

