File size: 5,149 Bytes
9634b36 c7a5739 9634b36 ad0b1f7 7998543 fb7ac68 7998543 06449e7 c7a5739 9634b36 7998543 06449e7 c7a5739 06449e7 7998543 c7a5739 7998543 c7a5739 06449e7 c7a5739 7998543 dfa54c4 7998543 06449e7 7998543 dfa54c4 7998543 dfa54c4 06449e7 dfa54c4 7998543 dfa54c4 7998543 dfa54c4 7998543 c7a5739 9634b36 06449e7 7998543 c7a5739 9634b36 06449e7 c7a5739 9634b36 06449e7 c7a5739 06449e7 c7a5739 7998543 c7a5739 06449e7 c7a5739 06449e7 c7a5739 9634b36 06449e7 9634b36 c7a5739 dfa54c4 9634b36 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
import gradio as gr
import pandas as pd
import fitz # PyMuPDF
import os
from huggingface_hub import HfApi
from huggingface_hub.utils import HfHubHTTPError
import time
def extract_paragraphs_with_headers(pdf_path, progress=None):
print(f"π Starting PDF Processing: {os.path.basename(pdf_path)}")
doc = fitz.open(pdf_path)
data = []
total_pages = len(doc)
max_iterations = total_pages * 2 # To prevent infinite loops
iteration_count = 0
for page_num, page in enumerate(doc):
iteration_count += 1
if iteration_count > max_iterations:
raise Exception("β οΈ PDF processing exceeded iteration limit. Possible malformed PDF.")
if progress is not None:
progress((page_num + 1) / total_pages, desc=f"Processing Page {page_num + 1}/{total_pages}")
blocks = page.get_text("dict")["blocks"]
for block in blocks:
if "lines" in block:
text = ""
for line in block["lines"]:
for span in line["spans"]:
text += span["text"] + " "
text = text.strip()
# Detect headers based on font size
is_header = any(span["size"] > 15 for line in block["lines"] for span in line["spans"])
data.append({
"page_num": page_num + 1,
"text": text,
"is_header": is_header
})
print(f"β
Finished Processing PDF: {os.path.basename(pdf_path)}")
return data
def upload_with_progress(file_path, repo_id, token, progress):
"""
Upload file to Hugging Face Dataset using upload_file() API method.
"""
print(f"π€ Starting upload of Parquet: {file_path}")
file_size = os.path.getsize(file_path)
api = HfApi()
try:
# Use upload_file() method from huggingface_hub
api.upload_file(
path_or_fileobj=file_path,
path_in_repo=os.path.basename(file_path),
repo_id=repo_id,
repo_type="dataset",
token=token
)
if progress is not None:
progress(1, desc="β
Upload Complete")
print(f"β
Successfully uploaded to {repo_id}")
return f"β
Successfully uploaded to {repo_id}"
except HfHubHTTPError as e:
print(f"β Upload failed: {e}")
return f"β Upload failed: {str(e)}"
except Exception as e:
print(f"β Unexpected error: {e}")
return f"β Unexpected error: {str(e)}"
def pdf_to_parquet_and_upload(pdf_files, hf_token, dataset_repo_id, action_choice, progress=gr.Progress()):
all_data = []
total_files = len(pdf_files)
print("π Starting PDF to Parquet Conversion Process")
for idx, pdf_file in enumerate(pdf_files):
if progress is not None:
progress(idx / total_files, desc=f"Processing File {idx + 1}/{total_files}")
# β
Step 1: Process PDF
extracted_data = extract_paragraphs_with_headers(pdf_file.name, progress=progress)
for item in extracted_data:
all_data.append({
'filename': os.path.basename(pdf_file.name),
'page_num': item['page_num'],
'text': item['text'],
'is_header': item['is_header']
})
print("π‘ Converting Processed Data to Parquet")
# β
Step 2: Convert to Parquet
df = pd.DataFrame(all_data)
parquet_file = 'papers_with_headers.parquet'
try:
df.to_parquet(parquet_file, engine='pyarrow', index=False)
print("β
Parquet Conversion Completed")
except Exception as e:
print(f"β Parquet Conversion Failed: {str(e)}")
return None, f"β Parquet Conversion Failed: {str(e)}"
upload_message = "Skipped Upload"
# β
Step 3: Upload Parquet (if selected)
if action_choice in ["Upload to Hugging Face", "Both"]:
try:
upload_message = upload_with_progress(parquet_file, dataset_repo_id, hf_token, progress)
except Exception as e:
print(f"β Upload Failed: {str(e)}")
upload_message = f"β Upload failed: {str(e)}"
print("π Process Completed")
return parquet_file, upload_message
# β
Gradio Interface
iface = gr.Interface(
fn=pdf_to_parquet_and_upload,
inputs=[
gr.File(file_types=[".pdf"], file_count="multiple", label="Upload PDFs (Drag & Drop or Search)"),
gr.Textbox(label="Hugging Face API Token", type="password", placeholder="Enter your Hugging Face API token"),
gr.Textbox(label="Your Dataset Repo ID (e.g., username/research-dataset)", placeholder="username/research-dataset"),
gr.Radio(["Download Locally", "Upload to Hugging Face", "Both"], label="Action", value="Download Locally")
],
outputs=[
gr.File(label="Download Parquet File"),
gr.Textbox(label="Status")
],
title="PDF to Parquet Converter with Correct Upload API",
description="Upload your PDFs, convert them to Parquet, and upload to your Hugging Face Dataset using the official API."
)
iface.launch()
|