PageIndex/run_pageindex.py

125 lines
5.6 KiB
Python
Raw Normal View History

import argparse
2025-08-26 21:27:40 +08:00
import os
import json
from pageindex import *
2025-08-26 21:27:40 +08:00
from pageindex.page_index_md import md_to_tree
if __name__ == "__main__":
# Set up argument parser
2025-08-26 21:27:40 +08:00
parser = argparse.ArgumentParser(description='Process PDF or Markdown document and generate structure')
2025-08-28 12:45:39 +08:00
parser.add_argument('--pdf_path', type=str, help='Path to the PDF file')
parser.add_argument('--md_path', type=str, help='Path to the Markdown file')
2025-08-28 13:07:15 +08:00
parser.add_argument('--model', type=str, default='gpt-4o-2024-11-20', help='Model to use')
2025-08-28 12:45:39 +08:00
parser.add_argument('--toc-check-pages', type=int, default=20,
2025-08-26 21:27:40 +08:00
help='Number of pages to check for table of contents (PDF only)')
parser.add_argument('--max-pages-per-node', type=int, default=10,
2025-08-26 21:27:40 +08:00
help='Maximum number of pages per node (PDF only)')
parser.add_argument('--max-tokens-per-node', type=int, default=20000,
2025-08-26 21:27:40 +08:00
help='Maximum number of tokens per node (PDF only)')
2025-08-28 12:45:39 +08:00
parser.add_argument('--if-add-node-id', type=str, default='yes',
help='Whether to add node id to the node')
parser.add_argument('--if-add-node-summary', type=str, default='no',
help='Whether to add summary to the node')
2025-08-28 12:45:39 +08:00
parser.add_argument('--if-add-doc-description', type=str, default='no',
help='Whether to add doc description to the doc')
2025-05-30 14:02:38 +08:00
parser.add_argument('--if-add-node-text', type=str, default='no',
help='Whether to add text to the node')
2025-08-28 12:45:39 +08:00
2025-08-26 21:27:40 +08:00
# Markdown specific arguments
2025-08-27 22:34:04 +08:00
parser.add_argument('--if-thinning', type=str, default='no',
2025-08-26 21:27:40 +08:00
help='Whether to apply tree thinning for markdown (markdown only)')
parser.add_argument('--thinning-threshold', type=int, default=5000,
help='Minimum token threshold for thinning (markdown only)')
parser.add_argument('--summary-token-threshold', type=int, default=200,
help='Token threshold for generating summaries (markdown only)')
args = parser.parse_args()
2025-08-28 12:45:39 +08:00
# Validate that exactly one file type is specified
if not args.pdf_path and not args.md_path:
raise ValueError("Either --pdf_path or --md_path must be specified")
if args.pdf_path and args.md_path:
raise ValueError("Only one of --pdf_path or --md_path can be specified")
2025-08-28 12:45:39 +08:00
if args.pdf_path:
# Validate PDF file
if not args.pdf_path.lower().endswith('.pdf'):
raise ValueError("PDF file must have .pdf extension")
if not os.path.isfile(args.pdf_path):
raise ValueError(f"PDF file not found: {args.pdf_path}")
2025-08-26 21:27:40 +08:00
# Process PDF file
# Configure options
opt = config(
model=args.model,
toc_check_page_num=args.toc_check_pages,
max_page_num_each_node=args.max_pages_per_node,
max_token_num_each_node=args.max_tokens_per_node,
if_add_node_id=args.if_add_node_id,
if_add_node_summary=args.if_add_node_summary,
if_add_doc_description=args.if_add_doc_description,
if_add_node_text=args.if_add_node_text
)
# Process the PDF
2025-08-28 12:45:39 +08:00
toc_with_page_number = page_index_main(args.pdf_path, opt)
2025-08-26 21:27:40 +08:00
print('Parsing done, saving to file...')
# Save results
2025-08-28 12:45:39 +08:00
pdf_name = os.path.splitext(os.path.basename(args.pdf_path))[0]
2025-08-26 21:27:40 +08:00
os.makedirs('./results', exist_ok=True)
with open(f'./results/{pdf_name}_structure.json', 'w', encoding='utf-8') as f:
json.dump(toc_with_page_number, f, indent=2)
2025-08-28 12:45:39 +08:00
elif args.md_path:
# Validate Markdown file
if not args.md_path.lower().endswith(('.md', '.markdown')):
raise ValueError("Markdown file must have .md or .markdown extension")
if not os.path.isfile(args.md_path):
raise ValueError(f"Markdown file not found: {args.md_path}")
2025-08-26 21:27:40 +08:00
# Process markdown file
print('Processing markdown file...')
# Process the markdown
import asyncio
2025-08-28 12:45:39 +08:00
# Use ConfigLoader to get consistent defaults (matching PDF behavior)
from pageindex.utils import ConfigLoader
config_loader = ConfigLoader()
# Create options dict with user args
user_opt = {
'model': args.model,
'if_add_node_summary': args.if_add_node_summary,
'if_add_doc_description': args.if_add_doc_description,
'if_add_node_text': args.if_add_node_text,
'if_add_node_id': args.if_add_node_id
}
# Load config with defaults from config.yaml
opt = config_loader.load(user_opt)
2025-08-26 21:27:40 +08:00
toc_with_page_number = asyncio.run(md_to_tree(
2025-08-28 12:45:39 +08:00
md_path=args.md_path,
if_thinning=args.if_thinning.lower() == 'yes',
2025-08-26 21:27:40 +08:00
min_token_threshold=args.thinning_threshold,
2025-08-28 12:45:39 +08:00
if_add_node_summary=opt.if_add_node_summary,
2025-08-26 21:27:40 +08:00
summary_token_threshold=args.summary_token_threshold,
2025-08-28 12:45:39 +08:00
model=opt.model,
if_add_doc_description=opt.if_add_doc_description,
if_add_node_text=opt.if_add_node_text,
if_add_node_id=opt.if_add_node_id
2025-08-26 21:27:40 +08:00
))
print('Parsing done, saving to file...')
# Save results
2025-08-28 12:45:39 +08:00
md_name = os.path.splitext(os.path.basename(args.md_path))[0]
2025-08-26 21:27:40 +08:00
os.makedirs('./results', exist_ok=True)
with open(f'./results/{md_name}_structure.json', 'w', encoding='utf-8') as f:
2025-08-28 12:45:39 +08:00
json.dump(toc_with_page_number, f, indent=2, ensure_ascii=False)