def fitz_pdf_to_line_df(file_path): doc = fitz.open(file_path) data = [] for page_num in range(len(doc)): page = doc[page_num] blocks = page.get_text("dict").get("blocks", []) line_num = 0 for block in blocks: if block.get("type") != 0: continue for line in block.get("lines", []): spans = line.get("spans", []) if not spans: continue text = "".join(s["text"] for s in spans) rect = fitz.Rect(spans[0]["bbox"]) for span in spans[1:]: rect |= fitz.Rect(span["bbox"]) data.append({ "page_num": page_num + 1, "line_num": line_num + 1, "text": text, "x0": float(rect.x0), "y0": float(rect.y0), "x1": float(rect.x1), "y1": float(rect.y1), }) line_num += 1 return pd.DataFrame(data)