()
| 1154 | |
| 1155 | |
| 1156 | def main() -> None: |
| 1157 | args = parser().parse_args() |
| 1158 | record = ensure_record(args.input) |
| 1159 | pdf_path = Path(str(record.get("pdf_path", "")).strip()).expanduser() |
| 1160 | if not pdf_path.exists(): |
| 1161 | from_fetch = maybe_load_json_record(args.input) or {} |
| 1162 | pdf_candidate = str(from_fetch.get("pdf_path", "")).strip() |
| 1163 | if pdf_candidate: |
| 1164 | pdf_path = Path(pdf_candidate).expanduser() |
| 1165 | if not pdf_path.exists(): |
| 1166 | raise SystemExit("extract_pdf_assets.py requires a resolvable local PDF path.") |
| 1167 | if fitz is None: |
| 1168 | raise SystemExit("extract_pdf_assets.py requires PyMuPDF (`fitz`).") |
| 1169 | |
| 1170 | asset_root = Path(args.assets_dir).expanduser().resolve() if args.assets_dir else default_assets_dir(record) |
| 1171 | images_dir = asset_root / "images" |
| 1172 | images_dir.mkdir(parents=True, exist_ok=True) |
| 1173 | |
| 1174 | figure_dpi = args.figure_dpi |
| 1175 | |
| 1176 | doc = fitz.open(pdf_path.resolve()) |
| 1177 | page_records: list[dict] = [] |
| 1178 | image_assets: list[dict] = [] |
| 1179 | figure_assets: list[dict] = [] |
| 1180 | asset_coverage: dict = {} |
| 1181 | try: |
| 1182 | total_pages = len(doc) |
| 1183 | page_limit = min(total_pages, args.max_pages) |
| 1184 | asset_coverage = { |
| 1185 | "total_pages": total_pages, |
| 1186 | "asset_max_pages": args.max_pages, |
| 1187 | "asset_pages_scanned": page_limit, |
| 1188 | "truncated_due_to_asset_page_limit": total_pages > args.max_pages, |
| 1189 | } |
| 1190 | for idx in range(page_limit): |
| 1191 | page = doc[idx] |
| 1192 | page_number = idx + 1 |
| 1193 | text = normalize_whitespace(page.get_text("text")) |
| 1194 | searchable_chars = len(text) |
| 1195 | extraction_method = "text" if searchable_chars >= args.min_searchable_chars else "none" |
| 1196 | ocr_text = "" |
| 1197 | if extraction_method == "none": |
| 1198 | ocr_text = ocr_page(page, args.ocr_dpi) |
| 1199 | if ocr_text: |
| 1200 | extraction_method = "ocr" |
| 1201 | page_images = extract_page_images(doc, page, page_number, images_dir) |
| 1202 | image_assets.extend(page_images) |
| 1203 | |
| 1204 | page_figures = extract_figure_regions(page, page_number, images_dir, dpi=figure_dpi) |
| 1205 | figure_assets.extend(page_figures) |
| 1206 | |
| 1207 | page_records.append( |
| 1208 | { |
| 1209 | "page_number": page_number, |
| 1210 | "searchable_text_chars": searchable_chars, |
| 1211 | "text_extraction_method": extraction_method, |
| 1212 | "ocr_used": extraction_method == "ocr", |
| 1213 | "image_count": len(page_images), |
no test coverage detected